在數據庫初始化產生時進行控制,有三個方法可以控制數據庫初始化時的行為。分別為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); }