2012-09-14 182 views
2

我們使用沒有Edmx文件的代碼優先的方法,它的運行良好,第一次創建數據庫。代碼第一次數據庫遷移

但是,如果我添加新的數據實體說新的類到我的數據庫上下文然後它不能將它添加到該數據庫中的新表。

舉例說,在數據庫中最初有兩個表。 EX數據庫:DbTest

表:TBL1,TBL2

現在,如果我添加新表,說類名稱「TBL3」,那麼就應該將它添加到現有的數據庫。

任何人都可以向我解釋一下如何通過代碼優先的方法來實現嗎?

我見過提到類似Database.SetInitializer(new ........)

我需要什麼就擺在上面構造的空白區域?

回答

1

如果你看看你的數據庫,你會看到一個名爲「EdmMetadata」的表,Entity Framework用它來確定自從數據庫創建以來(在你的情況下)你的模型是否有任何改變。

默認行爲是在模型和數據庫不同時引發異常。要獲得不同的行爲,您需要使用IDatabaseInitializer<TContext>

幸運的是,實體框架附帶此接口的一些默認的實現:

  • CreateDatabaseIfNotExists<TContext> - 如果不存在這將創建數據庫。
  • DropCreateDatabaseAlways<TContext> - 每次運行應用程序時都會重新創建數據庫。
  • DropCreateDatabaseIfModelChanges<TContext> - 如果在EdmMetadata表中檢測到更改(通常是創建新表的結果),將重新創建數據庫。

你當然也可以通過覆蓋InitializeDatabase方法來創建你自己的這個接口的實現。

使用這些初始化策略的一個示例如下所示:

Database.SetInitializer(
    new DropCreateDatabaseIfModelChanges<NameOfYourDbContextClass>()) 

選擇,你可能最終會失去已經進入到數據庫中的數據初始化策略之前,請仔細想想,這可能不是什麼你要。

由Entity Framework提供的實現提供了一個Seed方法來爲您的數據庫加載數據,以便您可以在每次創建數據庫時使用默認數據預加載數據庫。

This文章提供了更多信息。

相關問題