Database Initialization
下图是数据库初始化的工作流
EF为数据库初始化准备了多种策略:
l CreateDatabaseIfNotExists:这是默认的初始化策略
l DropCreateDatabaseAlways:总是创建数据库,不管数据库中是否存在数据,每次应用程序启动时就会重新设置
l DropCreateDatabaseIfModelChanges:有且仅当领域模型发生改变的时候创建数据库
若要启动测试数据则必须在应用程启动的时候通过Database.SetInitializer(new DropCreateDatabaseAlways<DBContext>())来初始化。
数据库初始化也可以继承最原始IDatabaseInitializer<>类来创建经典原始的初始化
public class AppTestContextCustomInitializer : IDatabaseInitializer<ApplicationDbContext>{
public void InitializeDatabase(ApplicationDbContext context){
if (context.Database.Exists()){
if (!context.Database.CompatibleWithModel(true)){
context.Database.Delete();}}
context.Database.Create();
context.Database.ExecuteSqlCommand("CREATE TABLE GLOBAL_DATA([KEY] VARCHAR(50), [VALUE] VARCHAR(250))");}}
可以通过配置文件来指定初始化数据库类
在<appSettings>节点中插入一个子节点:
<appSettings>
<add key="DatabaseInitializerForType CodeFirstDbInitializerDemo.BlogContext,CodeFirstDbInitializerDemo"
value="CodeFirstDbInitializerDemo.BlogContextCustomInitializer, CodeFirstDbInitializerDemo" />
</appSettings>
在模型中可用特性[Table(“tablename”)]指定存储的表格名称
EF中使用DbConfiguration类可定义一个Db配置类,使其继承DbConfiguration类,然后自定义Db配置,最后具体应用到具体的DbContext类上通过DbConfigurationType特性
如先创建一个配置类:
public class MyConfiguration : DbConfiguration{
public MyConfiguration(){
SetExecutionStrategy("providerName",()=>new SqlAzureExecutionStrategy());
SetDefaultConnectionFactory(new LocalDbConnectionFactory("v11.0"));}}
使用的话可以通过两种方式:
一种通过配置文件进行:
<entityFramework codeConfigurationType="MyNamespace.MyDbConfiguration, MyAssembly">
...Your EF config...
</entityFramework>
还有一种通过特性配置:
[DbConfigurationType(
typeof(MyDbConfiguration))]
publicclass
MyContextContext : DbContext
{
}