2012-11-21 48 views
3

在某些情況下,應用程序運行過程中,我需要打開標識插入:OnModelCreating - 迫使新的創造

modelBuilder.Entity<Activity>().Property(p => p.Id).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None); 

但是,因爲OnModelCreating只執行一次,這將是實現這一目標的最佳途徑?是否有可能重新創建模型?

回答

3

OnModelCreating將永遠只被調用一次。如果您需要重新創建模型,則必須手動創建DbModelBuilder

var builder = new DbModelBuilder(DbModelBuilderVersion.Latest); 
// setup whole model 
DbModel model = builder.Build(connection); 
DbCompiledModel compiledModel = model.Compile(); 
// cache compiledModel for future usage - compilation is very expensive 

var context = new DbContext(compiledModel); 

您應該儘量避免這種情況。身份插入與EF無法很好地協作,因此您很可能不得不直接使用SQL插入數據,並且不需要更改映射。

+0

嗨拉迪斯拉夫,有沒有一些信息爲什麼身份插入不能很好地與EF?我用我在問題中發佈的方法做了一些測試,到目前爲止沒有發現任何問題。如果你有一些信息,我會非常感激聽到它。我也在考慮使用Sql服務器查詢,但我試圖避免它,因爲如果我更改任何實體屬性名稱,例如,使用查詢時導入失敗,而如果使用DbContext,則不需要要注意這個問題。 – Goran

+0

我無法完成這項工作。當我使用構建mehtod時,我傳遞了一個SqlConnection連接對象。在這一點上,connection.Open()的工作沒有問題。在我編譯模型並將其傳遞給我的DbContext後,我收到一個錯誤(來自Sql服務器日誌):用戶「Server-PC \ TestUser」的登錄失敗。原因:無法打開顯式指定的數據庫'TestProject.Data.MyDbContext'。錯誤:18456,嚴重性:14,狀態:38. [客戶端:<本地計算機>]。 – Goran

+0

我忘了補充一句:爲什麼在這種情況下,模型構建器會嘗試使用上下文名稱連接到數據庫,而不是連接對象中正確的數據庫名稱?我正在使用的連接字符串是:「Data Source =。\\ SQLEXPRESS; Initial Catalog = TestDatabase; Integrated Security = True; MultipleActiveResultSets = True」 – Goran