在数据库初始化产生时进行控制,有三个方法可以控制数据库初始化时的行为。分别为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=,Category=,CreateId=},
new Resource { Name = "系统资源", IconCls="icon-navigation" ,ParentId=,Sort=,Category=,CreateId=},
new Resource { Name = "角色列表", IconCls="icon-navigation" ,ParentId=,Sort=,Category=,CreateId=},
new Resource { Name = "后台用户", IconCls="icon-navigation" ,ParentId=,Sort=,Category=,CreateId=},
new Resource { Name = "系统日志", IconCls="icon-navigation" ,ParentId=,Sort=,Category=,CreateId=}
};
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);
}