EF CodeFirst 數據庫初始化策略

最近用EF作了幾個小東西,瞭解簡單使用後有了深刻研究的興趣,因此想系統的研究一下EF CodeFist的幾個要點。下面簡單列一下目錄數據庫

1.1 目錄

  1. 數據庫初始化策略和數據遷移Migration的簡單介紹
  2. 配置一對一關係
  3. 配置一對多關係
  4. 配置多對多關係
  5. 開發環境配置Migration最佳實踐和生產環境配置Migration最佳實踐

2.1 數據庫初始化策略

http://www.entityframeworktutorial.net這個網站中,我找到相關數據庫初始化的策略app

2.1.1有四種不一樣的數據庫初始化策略:

  1. CreateDatabaseIfNotExists:這是默認的初始化程序。顧名思義,若是每一個配置都不存在,它將建立數據庫。可是,若是更改模型類,而後使用此初始化器運行應用程序,則會引起異常。
  2. DropCreateDatabaseIfModelChanges:若是您的模型類(實體類)已更改,則此初始化程序將刪除現有數據庫並建立新數據庫。因此,當模型類更改時,您沒必要擔憂維護數據庫模式。
  3. DropCreateDatabaseAlways:顧名思義,這個初始化器每次運行應用程序時都會丟棄一個現有的數據庫,而無論你的模型類是否已經改變。當您每次運行應用程序時都須要新的數據庫時,例如在開發應用程序時,這會頗有用。
  4. 自定義數據庫初始化程序:若是上述內容不知足您的要求,或者您想要使用上述初始化程序初始化數據庫,您也能夠建立本身的自定義初始化程序。

還有一種在列表中沒有體現,就是MigrateDatabaseToLatestVersion ,在配置自動化遷移(Automated Migration)中會使用。ide

若是要取消數據庫初始化策略,代碼爲:網站

Database.SetInitializer<YourDbContext>(null);spa

2.1.2定義數據庫初始化程序的示例代碼以下所示:

public class SchoolDBInitializer :  CreateDatabaseIfNotExists<SchoolDBContext>
{
    protected override void Seed(SchoolDBContext context)
    {
        base.Seed(context);
    }
}

注意實際上是有繼承關係的。 按照官方的說法:This separates the database initialization code from a context class.--這將數據庫初始化的代碼從context中分離出來.net

2.1.3 在配置文件中設置數據庫初始化策略

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>    
    <add key="DatabaseInitializerForType SchoolDataLayer.SchoolDBContext, SchoolDataLayer"
            value="SchoolDataLayer.SchoolDBInitializer, SchoolDataLayer" />
    </appSettings>
</configuration>

key的結構爲 DatabaseInitializerForType{namespace}.{className},value 同理。 若是要配置取消數據庫初始化策略,value=「Disabled」 便可。code

相關文章
相關標籤/搜索