说明
EF接口文档
接上一篇,EF通过SetInitializer(IDatabaseInitializer) 方法设置数据库初始化方式,因此我们可以通过实现IDatabaseInitializer接口自定义数据库初始化方式。除此之外,EntityFramework提供了五种数据库初始化方式,分别是
类 | 说明 |
---|---|
CreateDatabaseIfNotExists | 当数据库不存在时,创建并初始化数据库 |
DropCreateDatabaseAlways | 每次App Domain启动时,都删除并重建数据库 |
DropCreateDatabaseIfModelChanges | 当数据库模型发生改变时,删除并重建数据库 |
MigrateDatabaseToLatestVersion | 通过Migrations将数据库迁移到最新版本 |
NullDatabaseInitializer | 禁用初始化,相当于SetInitializer(null) |
下面是一些例子,我将SQL打印成日志,可以帮助我们分析。这里使用数据库SqlServer,将上一篇中MSDataProvider的SetDatabaseInitializer做了一些修改,其他代码不变。
测试代码如下:
[TestMethod]
public void InitDatabaseTest()
{
DataSettings setting = new DataSettings
{
DataConnectionString = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString,
DataProvider = ConfigurationManager.ConnectionStrings["Conn"].ProviderName,
DBType = ConfigurationManager.AppSettings["dbType"]
};
EfDataProviderManager manager = new EfDataProviderManager(setting);
IDataProvider provider = manager.LoadDataProvider();
provider.InitDatabase();
using (NopObjectContext context = new NopObjectContext(setting.DataConnectionString))
{
IDbSet<Vendor> set = context.Set<Vendor>();
//经测试 ,InitializeDatabase在这一步执行
Vendor vendor = set.Add(new Vendor
{
Name = "欢迎加QQ交流",
Email = "[email protected]"
});
context.SaveChanges();
}
}
CreateDatabaseIfNotExists
MSDataProvider代码:
public void SetDatabaseInitializer()
{
var initializer = new CreateDatabaseIfNotExists<NopObjectContext>();
Database.SetInitializer(initializer);
}
运行前数据库,我的数据库是develop,此时还没有创建
运行后,打印出的SQL(只留了关键部分):
2019-04-11 00:18:45,961 [12] DEBUG Nop.Data.NopObjectContext - Opened connection at 2019/4/11 0:18:45 +08:00
Nop.Data.NopObjectContext
2019-04-11 00:18:45,990 [12] DEBUG Nop.Data.NopObjectContext - Started transaction at 2019/4/11 0:18:45 +08:00
Nop.Data.NopObjectContext
2019-04-11 00:18:45,995 [12] DEBUG Nop.Data.NopObjectContext - CREATE TABLE [dbo].[Vendor] (
[Id] [int] NOT NULL IDENTITY,
[Name] [nvarchar](200) NOT NULL,
[Email] [nvarchar](400),
[Description] [nvarchar](max),
[PictureId] [int] NOT NULL,
[AdminComment] [nvarchar](max),
[Active] [bit] NOT NULL,
[Deleted] [bit] NOT NULL,
[DisplayOrder] [int] NOT NULL,
[MetaKeywords] [nvarchar](400),
[MetaDescription] [nvarchar](max),
[MetaTitle] [nvarchar](400),
[PageSize] [int] NOT NULL,
[AllowCustomersToSelectPageSize] [bit] NOT NULL,
[PageSizeOptions] [nvarchar](200),
CONSTRAINT [PK_dbo.Vendor] PRIMARY KEY ([Id])
) Nop.Data.NopObjectContext
2019-04-11 00:18:46,008 [12] DEBUG Nop.Data.NopObjectContext - CREATE TABLE [dbo].[VendorNote] (
[Id] [int] NOT NULL IDENTITY,
[VendorId] [int] NOT NULL,
[Note] [nvarchar](max) NOT NULL,
[CreatedOnUtc] [datetime] NOT NULL,
CONSTRAINT [PK_dbo.VendorNote] PRIMARY KEY ([Id])
) Nop.Data.NopObjectContext
2019-04-11 00:18:46,010 [12] DEBUG Nop.Data.NopObjectContext - CREATE INDEX [IX_VendorId] ON [dbo].[VendorNote]([VendorId]) Nop.Data.NopObjectContext
2019-04-11 00:18:46,011 [12] DEBUG Nop.Data.NopObjectContext - ALTER TABLE [dbo].[VendorNote] ADD CONSTRAINT [FK_dbo.VendorNote_dbo.Vendor_VendorId] FOREIGN KEY ([VendorId]) REFERENCES [dbo].[Vendor] ([Id]) ON DELETE CASCADE Nop.Data.NopObjectContext
2019-04-11 00:18:46,016 [12] DEBUG Nop.Data.NopObjectContext - CREATE TABLE [dbo].[__MigrationHistory] (
[MigrationId] [nvarchar](150) NOT NULL,
[ContextKey] [nvarchar](300) NOT NULL,
[Model] [varbinary](max) NOT NULL,
[ProductVersion] [nvarchar](32) NOT NULL,
CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY ([MigrationId], [ContextKey])
) Nop.Data.NopObjectContext
2019-04-11 00:18:46,019 [12] DEBUG Nop.Data.NopObjectContext - INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])
VALUES (N'201904101618447_InitialCreate', N'Nop.Data.NopObjectContext', 略 , N'6.2.0-61023')
Nop.Data.NopObjectContext
2019-04-11 00:18:46,029 [12] DEBUG Nop.Data.NopObjectContext - Committed transaction at 2019/4/11 0:18:46 +08:00
Nop.Data.NopObjectContext
以下LOG是我执行了set.Add
2019-04-11 00:18:46,110 [12] DEBUG Nop.Data.NopObjectContext - Opened connection at 2019/4/11 0:18:46 +08:00
Nop.Data.NopObjectContext
2019-04-11 00:18:46,111 [12] DEBUG Nop.Data.NopObjectContext - Started transaction at 2019/4/11 0:18:46 +08:00
Nop.Data.NopObjectContext
2019-04-11 00:18:46,172 [12] DEBUG Nop.Data.NopObjectContext - INSERT [dbo].[Vendor]([Name], [Email], [Description], [PictureId], [AdminComment], [Active], [Deleted], [DisplayOrder], [MetaKeywords], [MetaDescription], [MetaTitle], [PageSize], [AllowCustomersToSelectPageSize], [PageSizeOptions])
VALUES (@0, @1, NULL, @2, NULL, @3, @4, @5, NULL, NULL, NULL, @6, @7, NULL)
SELECT [Id]
FROM [dbo].[Vendor]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity() Nop.Data.NopObjectContext
2019-04-11 00:18:46,172 [12] DEBUG Nop.Data.NopObjectContext -
Nop.Data.NopObjectContext
2019-04-11 00:18:46,174 [12] DEBUG Nop.Data.NopObjectContext - -- @0: '用户名' (Type = String, Size = 200)
Nop.Data.NopObjectContext
2019-04-11 00:18:46,174 [12] DEBUG Nop.Data.NopObjectContext - -- @1: '[email protected]' (Type = String, Size = 400)
Nop.Data.NopObjectContext
2019-04-11 00:18:46,174 [12] DEBUG Nop.Data.NopObjectContext - -- @2: '0' (Type = Int32)
Nop.Data.NopObjectContext
2019-04-11 00:18:46,174 [12] DEBUG Nop.Data.NopObjectContext - -- @3: 'Fal