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); }