2012-06-11 25 views
6

我是第一個使用EF代碼的新手。我在生產中有一個現有的數據庫,我首先使用了EF 4.3.1代碼,並且一切正常。現在,我剛剛更新了我的數據庫架構,並得到了異常當數據庫模式首先使用EF代碼更改時,最簡單的事情是什麼

System.InvalidOperationException: The model backing the 'MyDbContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269). 

我不能使用DropCreateDatabaseIfModelChanges,因爲它是在生產,什麼是採取應對架構變化的最簡單的方法?

謝謝。

+1

您是否嘗試過的異常消息表明什麼? _Consider使用代碼首先遷移到更新數據庫(http://go.microsoft.com/fwlink/?LinkId=238269)._ – jrummell

+0

我不明白這一點,你有(過)現有的數據庫,你使用的代碼 - 第一!?假設您先使用代碼並使用該方法創建數據庫,然後更改實體模型並相應地更新數據庫。你的情景描述是:a)錯誤的或b)不知何怪。 –

+1

@YoupTube它比你想象的「逆向工程」和現有的數據庫代碼優先更常見。它比使用數據庫優先模型設計器更靈活。 – jrummell

回答

6

由於EF-CF的遷移是一個相當新的概念,我建議採取一種古老成熟的過程,並修改它與我們的新工具工作,像EF。以下是我們所做的:

  1. 使用DropCreateDatabaseIfModelChanges進行本地開發。這將允許您保持您的本地開發副本與您的模型同步(在代碼中)。每次構建/運行時都會獲得更新的本地數據庫。您還可以使用初始化程序加載測試數據等。Database.SetInitializer<DBContextNameHere>(new DBContextInitializerNameHere());

  2. 使用RedGate的SQLCompare工具比較本地開發與生產並自動生成部署的更改腳本。 (注:你也可以從工具自動部署)

http://www.red-gate.com/products/sql-development/sql-compare/index-b

的主要好處是,你不必改變你的本地開發過程中,你通過得到可重複和版本部署生成的腳本。您還可以將它與其SQL源代碼管理工具結合使用,以將所有SQL對象和部署腳本(甚至是數據)保存在源代碼管理中。

不,我不適合這些傢伙我只是喜歡他們的工具,以及它如何幫助我解決這個問題。

-1

我希望這個代碼,幫助全給你

EF- Code first migration

+0

儘管鏈接可能回答這個問題,但如果您可以在此處的答案中添加更多的細節,那會更好。這樣做會確保即使鏈接變爲非活動狀態,您的答案仍然有效。 – Harry

3

我發現,在數據庫上運行以下腳本

truncate table __MigrationHistory 

當你的代碼/ DB變成超出消除了這個問題同步。

也許我只是習慣了舊學校,建立&修補程序與數據庫設計,相應地修改代碼,或發現我需要一個新的領域,而編碼等......只需在兩個地方添加。

我會承認是新的(ish)到MVC,但有時這些功能是無用的,因爲它們隱藏了基本層面上的工作方式。當你瞭解所有東西是如何組合在一起的時候,所有的東西都有好的發電機和工具來幫助,但是當開始......我認爲它不是好的。

我遇到過許多不懂簡單概念的開發人員,因爲他們使用了代碼生成器,嚮導等。當涉及到編程實,或保持原有系統他們有點失去..

+0

我做了一個'骯髒的'保存,導致EF添加此表。刪除它解決了我的問題。謝謝! –

0

發生這種情況時,我通常運行遷移指向一個新的數據庫,一旦創建該數據庫,然後比較的結構新的與您現有的一個,如果需要的話手工做的修改(否則它可能給你的是什麼導致了錯誤的指示 - 意外的架構更改或索引等),然後刪除您的原始數據庫中的__MigrationHistory表中的條目和複製從你的新數據庫的條目,因此__MigrationHistory變得正確,Code First現在可以正確同步。

0

我加入解決了這個問題

Database.SetInitializer<MyContext>(null); to Application_Start() inside Global.asax.cs 
相關問題