簡體   English   中英

自創建數據庫以來,支持“ --Context”上下文的模型已更改-但是db是新的生產數據庫

[英]The model backing the '--Context' context has changed since the database was created - but db is new production database

我已經第762次遇到此錯誤,但是這一次,在嘗試訪問我的生產站點時,在刪除Azure上的“生產”數據庫然后發布我的站點后,我立即得到它。

The model backing the 'PropertyContext' context has changed since the database was created. Consider using Code First Migrations to update the database

我刪除了數據庫,因為無法以其他任何方式解決此問題,但仍然無法正常工作。

一些要點:

  • 我正在使用EF6並發布到Azure。
  • 這是使用相同Repo項目的2個項目/站點中的1個。 我沒有
    另一個問題,僅此一個。
  • 我嘗試過先發布問題項目(刪除數據庫后),然后發布具有相同結果的項目。
  • 我嘗試從Azure刪除WEBSITES和數據庫,然后重新開始
  • 我嘗試刪除所有遷移並從新的數據模型開始
  • 我已經在Global.asax中嘗試了以下方法(在兩個項目中)

    Database.SetInitializer PropertyContext>(空); <-所以我不會讓第一個<

Database.SetInitializer(new MigrateDatabaseToLatestVersion<PropertyContext, MyConfiguration>());
new PropertyContext().Database.Initialize(true);

我正在使用.net 4.5

為什么在新數據庫上出現此錯誤,如何使該站點正常工作?

只是在ASP.Net應用程序中遇到了相同的錯誤。 在我的情況下,我沒有使用Code First,但是我使用了標准的ASP.Net身份驗證提供程序,該提供程序顯然使用了Code First,並且由於此問題而導致身份驗證被破壞。

這是一種快速而骯臟的解決方案,因為您不太在意現有的用戶記錄:

對我來說,解決方案是刪除dbo.__MigrationHistory表,此后身份驗證開始正常工作。 意識到! 此解決方案並不適合所有人! 這樣可以解決問題,但是有潛在的風險。

如果您負擔不起丟失AspNet *表中的數據:

ASP.Net身份驗證提供程序會自動在數據庫中創建表:

  • AspNetRoles
  • AspNetUsers
  • AspNetUserRoles
  • AspNetUserClaims
  • AspNetUserLogings

默認情況下,這些表為空,如果您尚未為網站創建任何新的登錄名,則可以使用上面的“快速而又骯臟”的解決方案。 如果您確實關心保留用戶信息,或者只是想了解Code First遷移的工作方式,請按照以下步驟操作:

  • 打開Web.config文件,並檢查數據庫連接字符串的名稱。 這將是<connectionStrings>元素下的記錄之一。
  • 打開軟件包管理器控制台:

    工具–>庫軟件包管理器–>軟件包管理器控制台

  • 在“程序包管理器控制台”窗口中,使用下拉菜單設置“默認項目”。 確保這是包含ASP.Net身份驗證提供程序代碼的項目。
  • 執行命令:
    Update-Database -ConnectionStringName MyConnectionStringName

將MyConnectionStringName替換為您在web.config中查找的實際名稱。

作為此命令的結果,您將看到一個新文件夾“ Migrations”,其中包含由Update-Database命令生成的一堆代碼。 重建並重新部署您的應用程序,新的遷移代碼將在啟動時執行,並使數據庫架構與ASP.Net身份驗證提供程序代碼的更新版本同步。

當將Code First與Migrations一起使用時,數據庫將創建一個名為__MigrationHistory的表來跟蹤當前模式。 當您運行應用程序時,實體框架將檢查該表以確保數據庫架構與您的數據庫實體匹配。 如果它們不匹配,則會出現此錯誤。

要更新數據庫,請按照下列步驟操作:

  1. 在Visual Studio中打開程序包管理器控制台(視圖->其他Windows->程序包管理器控制台)
  2. 在“程序包管理器控制台”窗口中,您的項目會出現一個下拉列表,請確保將其設置為包含DbContext的項目。
  3. 確保包含您的App.Config / Web.Config文件的項目是“設置為啟動項目”(如果您有多個Config,則它必須是定義了數據庫連接字符串的項目。
  4. 鍵入Update-Database -ConnectionStringName MyConnString ,其中MyConnStringApp.Config / Web.Config連接字符串的名稱 (而不是實際的連接字符串)

如果出現這樣的錯誤:“由於存在未決的更改並且自動遷移被禁用,因此無法更新數據庫以匹配當前模型。”

您應該啟用自動遷移,然后重試。 啟用自動遷移

  1. Migrations文件夾中(在具有DbContext的項目中),打開Configuration.cs
  2. 確保構造函數包含: AutomaticMigrationsEnabled = true;

要阻止Entity Framework / DbContext監視數據庫上的更改,您只需刪除數據庫中的__MigrationHistory表即可。 然后由您決定確保數據庫保持手動更新。

MSDN文章在這里

解決方案是使用靜態方法SetInitializer並將Null值綁定到上下文。 如果您使用的是Web解決方案,則編寫代碼的最佳位置是Global.asax.cs文件的Application_Start。

protected void Application_Start() 
{
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);
    //...
    Database.SetInitializer<MyContext>(null);
}

今天早上我遇到了類似的問題。 突然出現錯誤,無法解決:

The model backing the 'ApplicationDbContext' context has changed since 
the database was created. Consider using Code First Migrations to update 
the database

我有一個MVC項目,另一個有模型,上下文和存儲庫項目。 我已經研究了好幾個星期,但是今天它停止了。

我試圖刪除數據庫,啟用遷移,添加遷移和更新數據庫的次數太多了,以至於我數不清了。 我已經將初始化程序添加到MigrateDatabaseToLatestVersion以及DropCreateDatabaseIfModelChanges。 一切都是徒勞...

最終使它工作的是將模型,上下文和存儲庫移入MVC項目(這不是我熱衷的事情)……然后它可以直接使用,而無需更改任何代碼(除了名稱空間)! 很奇怪...

為了解決這個問題,我白天讀了很多博客文章。 其中一個(我不知道哪個)提到了Visual Studio 2013中的一個錯誤,該錯誤中的DLL文件的引用並非總是按應有的方式更新,這表明我在運行添加遷移和更新時,我的MVC項目丟失了某些內容數據庫在我的單獨項目中。 但這只是一個猜測。

我在解決方案中使用EF 6.1和.Net 4.5.1。

有類似的問題! 答案在這里http://www.asp.net/mvc/overview/older-versions/getting-started-with-aspnet-mvc3/cs/adding-a-new-field

(Rick Anderson)有兩種方法可以解決該錯誤:

  1. 讓實體框架根據新的模型類架構自動刪除並重新創建數據庫。 在測試數據庫上進行主動開發時,此方法非常方便,因為它使您可以快速一起發展模型和數據庫模式。 但是,不利的一面是您丟失了數據庫中的現有數據,因此您不想在生產數據庫中使用這種方法!

  2. 明確修改現有數據庫的架構,使其與模型類匹配。 這種方法的優點是可以保留數據。 您可以手動進行更改,也可以通過創建數據庫更改腳本進行更改。

我已經花了幾個小時試圖解決這個問題。 一個項目正在工作,而另一個則沒有。

我有不同的項目引用了不同版本的Entity Framework 就我而言,我有一個Console應用程序和一個Windows Service應用程序,都引用了包含代碼第一類和DbContext的第三個項目。

運行Update-Package EntityFramework之后,在兩個項目中一切都正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM