2011-10-13 93 views
0

我的應用程序使用EF代碼優先設計,所有的一般工作得很好。EF代碼第一次數據庫/表初始化 - 什麼時候發生?

通過一個私有配置文件,我可以指定如何讓EF處理對db模式的更改,並根據需要創建/重新創建相關表 - 這些選項是「never」,「create」,「always」 ,「onSchemaChanged」和(將來)「onSchemaModified」。

這種運作良好 - 但我在幾個地方迷路.....

在開發過程中,我想用在 「Database in use error with Entity Framework 4 Code First」中描述的鉤 - 但這似乎執行在我的節目」

public void InitializeDatabase(Context context) 
    { 
     context.Database.SqlCommand("ALTER DATABASE Tocrates SET SINGLE_USER WITH ROLLBACK IMMEDIATE"); 
     _initializer.InitializeDatabase(context); // Maybe this does nothing if not needed 
     context.Database.SqlCommand("ALTER DATABASE Tocrates SET MULTI_USER") 
    } 

所以..真實,我的問題的每一次運行:有,我可以用它來檢測是否EF實際上是試圖修改數據庫的覆蓋,這樣我就可以設置此SINGLE_USER東西何時需要?如果是這樣,我可以檢測到原因 EF正在執行所以(看我上面的選項列表),所以我可以登錄更改的原因?...

非常感謝所有的幫助和建議。

回答

2

除非您已將數據庫初始化程序設置爲null初始化程序在第一次使用環境時運行總是一次(每個應用程序生存期)。那麼,什麼實際發生取決於初始化(你內心_intializer):

  • 對於DropCreateDatabaseAlwaysCreateDatabaseIfNotExists這是由他們的名字,他們做什麼不清楚。

  • 對於DropCreateDatabaseIfModelChanges只有模型是否改變的問題。 EF通過將模型散列與存儲在數據庫中的散列進行比較來檢測此情況。您可以自定義InitializeDatabase內,如果你想送你SqlCommands或無法通過調用檢查這個自己...

    bool compatible = context.Database.CompatibleWithModel(true); 
    

    ...,然後再決定根據結果。 (不要用自己創建的context來調用它,因爲在檢查模型兼容性之前,它會首先初始化數據庫。)參數bool throwIfNoMetadata(在我的示例中爲true)會導致EF在引發異常時拋出異常if數據庫中的模型哈希不存在。否則在這種情況下該方法將返回true

  • 對於自定義內部初始值設定項:無論您的代碼將執行什麼操作。

+0

非常好!這正是我正在尋找的 - 謝謝。 – JcMaltaDev