在第一次运行Code-First应用程序后已经创建了一个数据库,但是第二次启动时呢?每次运行应用程序时会创建一个新的数据库吗?生产环境怎么样?更改域模型时,如何更改数据库?要处理这些情况,必须使用一个数据库初始化策略。
有四种不同的数据库初始化策略:
CreateDatabaseIfNotExists:这是默认的初始化程序。顾名思义,如果没有配置,它将创建数据库。但是,如果更改模型类,然后使用该初始化程序运行应用程序,那么它将抛出异常。
DropCreateDatabaseIfModelChanges:如果你的模型类(实体类)已更改,则此初始化程序将删除现有数据库并创建新数据库。因此,当你的模型类更改时,无需担心维护数据库模式。
DropCreateDatabaseAlways:顾名思义,该初始化程序在每次运行应用程序时都会删除现有数据库,而不管模型类是否已更改。当你需要最新数据库时,每次运行应用程序时,就像新开发应用程序一样。
Custom DB Initializer:你还可以创建自己的自定义初始化程序,如果上述任何一个不满足要求,或者你想使用上述初始化程序初始化数据库的其他方法。
要使用上述数据库初始化策略之一,必须在Context类中使用Database类设置DB Initializer,如下所示:
public class SchoolDBContext: DbContext { public SchoolDBContext(): base("SchoolDBConnectionString") { Database.SetInitializer<SchoolDBContext>(new CreateDatabaseIfNotExists<SchoolDBContext>()); //Database.SetInitializer<SchoolDBContext>(new DropCreateDatabaseIfModelChanges<SchoolDBContext>()); //Database.SetInitializer<SchoolDBContext>(new DropCreateDatabaseAlways<SchoolDBContext>()); //Database.SetInitializer<SchoolDBContext>(new SchoolDBInitializer()); } public DbSet<Student> Students { get; set; } public DbSet<Standard> Standards { get; set; } }
你也可以通过继承其中一个初始值设置来创建自定义DB初始值设置,如下所示:
public class SchoolDBInitializer : CreateDatabaseIfNotExists<SchoolDBContext> { protected override void Seed(SchoolDBContext context) { base.Seed(context); } }
如上面代码所示,我们创建了一个新的SchoolDBInitializer类,它由CreateDatabaseIfNotExists初始化器派生。
在配置文件中设置db initializer:
你也可以在配置文件中设置db initializer。 例如,要在app.config中设置默认的初始化程序:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="DatabaseInitializerForType SchoolDataLayer.SchoolDBContext, SchoolDataLayer" value="System.Data.Entity.DropCreateDatabaseAlways`1[[SchoolDataLayer.SchoolDBContext, SchoolDataLayer]], EntityFramework" /> </appSettings> </configuration>
你可以设置自定义DB初始化程序,如下所示:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="DatabaseInitializerForType SchoolDataLayer.SchoolDBContext, SchoolDataLayer" value="SchoolDataLayer.SchoolDBInitializer, SchoolDataLayer" /> </appSettings> </configuration>
这样,你就可以为应用程序使用数据库初始化策略。