14

傳統上我總是手工編寫我的sql腳本,所以他們很好,很乾淨(我不是生成者的粉絲)併發布發佈,我提供了新的安裝腳本和以前版本的遷移腳本,創建新的表格,改變現有的表格等等。這是非常標準的。EF 4代碼如何首先處理生產環境中的模式更改?

我並沒有真正有足夠的時間來使用EF 4代碼,但如果它在生產環境中真正可行,我很有興趣使用它。

假設你有一個代碼優先的方法,如果一個數據庫不存在,數據庫將自動創建。如果您發佈具有架構/模型更改的新版軟件,會發生什麼情況。 EF足夠聰明地更新數據庫模式以匹配更新的EF模型嗎?

方案

  1. 客戶端安裝的服務器上的asp.net MVC的網站。在第一次運行時,將創建一個新的數據庫
  2. 客戶端使用的網站了一段時間,在數據庫中獲取一些數據
  3. 同時該網站的一個新版本發佈和EF模式發生了變化
  4. 客戶端下載新的填充版本,部署網站,指向現有的數據庫

是代碼首先只對初始部署有用呢,還是足夠聰明來更新現有的數據庫版本而這樣嗎?

回答

6

從EF CTP4開始,每當您更改對象模型時,您的數據庫將被刪除並重新創建(這不是默認約定,您必須通過設置數據庫初始值設定程序策略明確告知EF Code-First )。

話雖這麼說,EF團隊正在積極工作的一個Database Evolution (aka Migrations) Solution恰好解決您的方案:一個解決方案,將發展的數據庫模式隨着時間的推移基本上試圖改變數據庫能回到你的對象模型更改與您的模型同步,而不是重新創建它。

按照EF團隊,這個功能將可作爲EF下一個版本的一部分是在軌道上的2011年

+0

很好的瞭解,但直到特點是在野外,我不認爲這是我可以在辦公室倡導的路線。 – 2010-11-18 03:58:33

+0

是的,我不確定EF 4框架是否足夠成熟來處理這個問題。感謝您的鏈接。我會暫緩這個功能,並在2011年初監控EF團隊的更新。乾杯! – 2010-11-18 04:16:52

+1

@confusedGeek:即使在發佈此功能後,我相信沒有企業會將他們的生產數據庫提供給EF來爲他們即時修復。 alter script始終必須通過DBA,無論是由您還是由EF編寫。 – 2010-11-18 04:42:20

2

創建數據庫的能力,第一季度發佈只是一個功能 Code First - 這是一個可選功能。您根本不必使用此功能。實際上,Scott Gu有一個完整的博客文章,專門用於使用Code First with an existing database

在數據庫遷移發佈之前,您必須提出另一種策略,該策略將簡單地管理您的ALTER TABLE腳本,就像您傳統上那樣。因此,當您部署新版本時,您將運行ALTER腳本並部署包含對模型所做更改的代碼。儘管如此,在Code First中可以獲得更多的選擇,而不是每次簡單地刪除和重新創建數據庫(這只是一個選項)。您還可以將初始化程序設置爲僅在模型更改時重新創建數據庫。您還可以將初始化程序設置爲永不運行(在手動管理數據庫更改的情況下)。This post將爲您提供有關EF數據庫初始值設定項的更多信息。

0

我正在處理數據庫上下文初始值設定項,它將在模型和數據庫模式不同步時通知網站管理員。這對於喜歡對代碼優先模型和數據庫模式都有完全控制權的開發人員非常有用。檢查出來:

https://github.com/rialib/efextensions

0

個月過去了,現在官方的答案已經發布:IDatabaseInitializer

這裏或多或少你在找什麼:

public class DoNothingWithMyDatabase<TContext> : IDatabaseInitializer<TContext> 
    where TContext : DbContext 
{ 
    public void InitializeDatabase(TContext context) 
    { 
    } 
} 

從這裏摘自:http://blog.cincura.net/231783-ultimate-efv4-ctp4-code-first-full-mapping-example-using-firebird/

現在你可以改變你的模式,你習慣的方式。當然,你也可以編寫一個更復雜的使用C#代替SQL的DatabaseInitializer,並且執行更復雜的事情,比如在執行它之前檢查是否需要更改,在數據更改表時轉換數據等。

另一個StackOverflow的問題,與一些修改表的細節涉及: Entity Framework Code First fluent API setting field properties in a for loop

0

使用EF 6,U可以重新設計你的數據庫(代碼優先),確保所有的更新都安裝,有時ü可以有不同的模式您現有數據庫在您的上下文中使用它們類

modelBuilder.Entity<Charge>().ToTable("FullDepot.Charge"); 

,如果你不EF只挑選了dbo.yourtable,而不是像桌子等FullDepot.secondtable