Dot-Net

EF 4.1 程式碼優先 - OnModelCreating 呼叫時間

  • December 3, 2014

當我調試我的應用程序時,這個方法似乎沒有在 DbContext 的建構子上下文中執行。那麼什麼時候呼叫呢?

當 EF 第一次需要訪問數據庫時呼叫此方法(因此它不在上下文實例化期間)。如果數據庫不存在,它使用來自已編譯模型的資訊來創建它。每個應用程序只創建一次模型(它在內部記憶體),因此即使您處理上下文,您的模型仍將被重用於下一個實例。

需要明確的是,OnModelCreating 與 EF 是否為您創建數據庫無關。

為了與數據庫互動,Entity Framework 必須建立一個將被持久化的實體模型。如果它尚未建構和記憶體該模型,則會觸發此事件。

建立模型後,會從中生成一個雜湊,然後 EF 嘗試連接到數據庫以查看 (a) 它是否存在,(b) 它是否包含版本資訊、儲存在 EdmMetadata 表中的先前雜湊,以及 ( c) 該散列是否與先前從模型計算的散列匹配。

如果散列不匹配,EF 使用已設置的數據庫初始化程序(通過呼叫Database.SetInitializer(new SomeInitializerType()),它可能會或可能不會刪除、創建或以其他方式修改您的數據庫。預設初始化程序,當您沒有指定其他初始化程序時使用,它對您的數據庫沒有任何作用,一旦它執行,如果它不同步,Entity Framework 將拒絕與數據庫互動。

如果您的數據庫不包含其中包含雜湊的 EdmMetadata 表,Entity Framework 假定您正在自己管理數據庫模式並愉快地嘗試使用它,希望您做對了。如果該架構稍後與 EF 的期望不匹配,則在呼叫 SaveChanges() 等時會出現錯誤。

在所有這些場景中,無論您是管理自己的數據庫架構還是讓 EF 刪除並根據需要重新創建它,無論數據庫是否與您的模型同步,OnModelCreating 事件都會在實體框架第一次需要知道什麼時觸發它在持續。

引用自:https://stackoverflow.com/questions/5634338