Entity Framework 数据库初始化的三种方法

在数据库初始化产生时进行控制,有三个方法可以控制数据库初始化时的行为。分别为CreateDatabaseIfNotExists、DropCreateDatabaseIfModelChanges、DropCreateDatabaseAlways。

一、定义

1、CreateDatabaseIfNotExists:在没有数据库时创建一个,这是默认行为。

2、DropCreateDatabaseIfModelChanges:模型改变时,自动重新创建一个新的数据库,就可以用这个方法。在这开发过程中非常有用。

3、DropCreateDatabaseAlways:每次运行时都重新生成数据库。

二、使用

1、新建一个类继承

public class EasyUIInitializer : DropCreateDatabaseIfModelChanges<EasyUIContext>
{
  
}

2、重写Seed方法,插入数据

protected override void Seed(EasyUIContext context)
{
    var resources = new List<Resource> 
    { 
        new Resource { Name = "其它管理", IconCls="icon-widgets" ,ParentId=null,Sort=100000,Category=1,CreateId=1},
        new Resource { Name = "系统资源", IconCls="icon-navigation" ,ParentId=1,Sort=1,Category=2,CreateId=1},
        new Resource { Name = "角色列表", IconCls="icon-navigation" ,ParentId=1,Sort=5,Category=2,CreateId=1},
        new Resource { Name = "后台用户", IconCls="icon-navigation" ,ParentId=1,Sort=5,Category=2,CreateId=1},
        new Resource { Name = "系统日志", IconCls="icon-navigation" ,ParentId=1,Sort=5,Category=2,CreateId=1}
    };
    resources.ForEach(s => context.Resource.Add(s));
    context.SaveChanges();

    base.Seed(context);
}

3、运行

  在Global.asax里执行

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);

    Database.SetInitializer<EasyUIContext>(new EasyUIInitializer());
}

  或在EF上下文的OnModelCreating里执行

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    Database.SetInitializer<EasyUIContext>(new EasyUIInitializer()); 
}

4、其它

初始化包括两个主要步骤。首先,使用Code First在内存中根据默认规则和配置创建模型。其次,使用已设置的数据库初始化器将用于存储数据的数据库初始化。

初始化是延迟加载的,所以创建一个实例的是不完全满足初始化发生的条件的。必须执行对模型的操作,如查询或添加实体才会发生。

但我们可以可以调用DbContext.Database.Initialize方法,对模型执行任何操作的时候强制初始化。

using (var context = new EasyUIContext()) 
{
    context.Database.Initialize(true); 
}
posted @ 2016-05-18 09:41  a boy  阅读(8942)  评论(0编辑  收藏  举报