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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM