2017-03-09 146 views
0

在我的實體框架代碼的第一個項目,如果我跑透過包裝看到EF代碼第一次更新數據庫-Script不運行種子()方法

update-database

命令管理控制檯,我Seed()方法成功運行。但是,如果我運行帶有-script參數的命令:

update-database -script 

...種子()方法不調用,用於播種數據庫生成的SQL不包含SQL命令。這種行爲是可重複的。我正在嘗試創建一個完整的數據庫腳本進行部署。

爲什麼會出現與-script,沒有它運行SQL命令之間的差異,我怎麼能得到update-database運行Seed()方法使用-script開關是什麼時候?

回答

1

我認爲這不是一個差異,而是一個設計特徵。

其中之一,當您使用-script時,數據庫更新不會執行,因此也不應該調用Seed()方法。還有一個事實是遷移是一個設計時間工具,Seed()是一個在運行時編譯和調用的方法。

至於爲什麼不包含在生成腳本Seed()方法的內容,我的回答也運行設計時間的不同的概念。試想一下,你有一個Seed()方法是這樣的:

protected override void Seed(PersonContext context) 
{ 
    Random r = new Random(); 
    context.People.Add(new Person("PersonA", r.Next(90)); 
    context.SaveChanges(); 
} 

現在Random的實例在運行時創建,並且下一步()被調用運行時。你會如何將它編譯爲SQL?如果你有一個文件,你從它讀取數據並將其放入數據庫會怎麼樣?這些都是在設計時無法評估的所有事情,只有在運行時(即,如果文件在設計時不在正確的位置,那麼只有在運行時纔是問題)。這就是爲什麼像遷移腳手架這樣的設計時間工具無法評估它的原因。

+0

不夠公平。然而,數據庫通常需要某種相當靜態的「種子」數據來表達像Enums這樣的東西。我不能使用update-database -script來爲不包括EmployeeType(1,「Permanent」)(2,「Temporary」)等等的Ops生成DB部署腳本。 –

+1

是的,的確如此。但這不在遷移範圍之內。如果你想要這樣的東西,你必須自己寫。我在大部分項目中也採用這種方法。 如果您擔心如何構建項目或在何處放置這些腳本,則應考慮SSDT。但是在這種情況下,你必須自己編寫這些腳本。 –

+0

在Configuration.cs中實現它真的很方便 - 這已經在源代碼管理中,並且隱含地與遷移保持一致。我想盡可能自動化。我應該問另一個SO問題:) –

相關問題