2013-02-19 29 views
32

自創建數據庫以來,支持'MyDbContext'上下文的模型已經更改。考慮使用Code First Migrations來更新數據庫(http://go.microsoft.com/fwlink/?LinkId=238269)。支持數據庫上下文的模型已更改;考慮代碼優先遷移

是什麼導致了這種情況發生?我從字面上創建了一個全新的數據庫並且什麼也沒有改變,但是每次我嘗試從控制器訪問模型時,都會拋出這個問題。

編輯

這事做的事實,我試圖用兩個獨立的實體共享一個連接字符串(即數據庫)。

+0

只要兩個實體都在同一的DbContext,那麼這不應該是一個問題。您將DbContext配置爲使用連接字符串,並且所有實體都將使用它。 – AaronLS 2013-02-19 01:39:19

+0

我有這個相同的問題,但我的解決方法是在包管理器控制檯中啓用遷移。我不知道爲什麼這個工作。 – droo46 2015-06-11 15:33:47

回答

31

EF codefirst將查看您的DbContext,並發現在其中聲明的所有實體集合(並通過導航屬性查看與這些實體相關的實體)。然後它會查看你給它一個連接字符串的數據庫,並確保那裏的所有表都匹配模型中實體的結構。如果它們不匹配,那麼它不能讀/寫這些表。任何時候當你創建一個新的數據庫,或者如果你改變了一些關於實體類聲明的內容,比如添加屬性或者改變數據類型,那麼它會檢測到模型和數據庫不同步。默認情況下,它只會給你上面的錯誤。通常在開發過程中,你想要發生的是數據庫被重新創建(擦除任何數據)並從新的模型結構中重新生成。

要做到這一點,請參閱「RecreateDatabaseIfModelChanges功能」在這篇文章中: http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

你基本上需要提供從DropCreateDatabaseIfModelChanges繼承(RecreateDatabaseIfModelChanges現在已經過時)的數據庫初始化。爲此,只需將此行添加到Global.asax文件的Application_Start方法即可。

Database.SetInitializer<NameOfDbContext>(new DropCreateDatabaseIfModelChanges<NameOfDbContext>()); 

一旦你去生產,不再想丟失數據,那麼你最好刪除此初始化,而使用的數據庫遷移,這樣你可以在不丟失數據部署的變化。

+3

'RecreateDatabaseIfModelChanges'現在是'DropCreateDatabaseIfModelChanges':[看到這篇文章](http://forums.asp.net/t/1794419.aspx?Cannot+find+RecreateDatabaseIfModelChanges)。 – 2015-05-05 19:29:52

+0

謝謝,它解決了我的問題。 – adnan 2016-08-15 03:46:52

+0

我正在使用一個已經存在多年的數據庫,許多其他系統依賴於該數據庫,因此我根本無法在該數據庫上更改任何內容。其實我從來沒有參加過13年專業開發項目,因爲我們可以更改數據庫,因爲som代碼已更改。我將如何解決完全相同的錯誤? – 2017-08-03 12:01:02

24

爲了解決這個錯誤寫下面的代碼中的Application_Start在Global.asax.cs中()方法文件

Database.SetInitializer<MyDbContext>(null); 
+20

這是解決問題還是隱藏症狀? – 2015-03-26 20:04:38

+0

也許它阻止了ERM接觸數據庫(有時候這就是我們想要的)。不知道到底做了什麼。 – Ernesto 2017-07-14 19:19:59

1

發生這種情況時,你的表結構和模型類不再同步。您需要根據模型類更新表結構,反之亦然 - 這是您的數據很重要並且不能刪除的時候。如果你的數據結構已發生變化,數據不是對你很重要,你可以在你的的Global.asax.cs加入以下代碼使用DropCreateDatabaseIfModelChanges功能(前身爲「RecreateDatabaseIfModelChanges」功能):

Database.SetInitializer<MyDbContext>(new DropCreateDatabaseIfModelChanges<MyDbContext>()); 

再次運行您的應用程序。顧名思義,這會丟棄數據庫並根據最新的模型類(或類)重新創建 - 假設您相信模型類中的表結構定義是最新的和最新的;否則改爲改變模型類的屬性定義。

+0

因此數據庫將在此之後下降,對不對? – hakan 2015-07-12 15:48:51

1

如果更改了桌子的模型和數據庫已經存在,您會收到錯誤「模式來頭DB語境已經改變;充分考慮代碼首先遷移」你應該:

  • 刪除下的文件在您的項目
  • 打開包管理器控制檯「移植」文件夾,運行pm>update-database -Verbose
16

在我的情況下,這個錯誤是由_MigrationsHistory表在數據庫中存在造成的。刪除該表可解決問題。不知道該表是如何進入我們的測試環境數據庫的。

+1

這對我來說是最快捷的解決方案。我在表中添加了1個新的「位」列,並將相應的屬性添加到我的C#模型中。我不想刪除所有數據並重置所有內容,所以我剛剛刪除了這個_Migrations歷史記錄表,並且它在C#中拾取了新列。 – AlbatrossCafe 2016-06-15 19:11:28

+1

同樣的交易;我很擔心所有代碼優先移植的東西,我不得不這樣做,當時顯然沒有。刪除_MigrationsHistory表也爲我清除了一切! – StevieTimes 2016-10-19 05:09:00

+1

解決了我的問題。謝謝 – Suman 2017-07-24 08:48:04

5

如果您對上下文進行了更改並且想要手動對DB進行相關更改(或保持原樣),則會出現一種快速且骯髒的方式。

轉到數據庫,並刪除一切從「_MigrationHistory」表

3

最簡單,最安全的方法 如果你知道你真的想改變/更新數據結構,數據庫可以與你的DbContext同步,最安全的辦法是:

  1. 打開你的包管理器控制檯
  2. 類型:更新數據庫-verbose -force

這告訴EF使之符合您的DbContext數據結構

1

實體框架檢測一些有關的模式發生了變化,你需要做一些數據庫得到這個工作,修改你的數據庫。解決方案:。啓用遷移。更新數據庫

0

你需要相信我。 我得到這個錯誤的原因很簡單,我忘了在啓動項目的App.Config(我的是一個wpf項目)中添加連接字符串。

整個配置在我的情況

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <connectionStrings> 
    <add name="ZzaDbContext" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=ZaaDbInDepth;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" providerName="System.Data.SqlClient"/> 
    </connectionStrings> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 
    </startup> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="mssqllocaldb" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 
</configuration> 
相關問題