自创建数据库以来,支持’–Context’上下文的模型已更改 – 但db是新的生产数据库

我在第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和DB,然后重新开始
  • 我尝试删除所有迁移并从新数据模型开始
  • 我在我的Global.asax中尝试了以下内容(在两个项目中)

    Database.SetInitializer PropertyContext>(null); < – SO不会让我把第一个<

 Database.SetInitializer(new MigrateDatabaseToLatestVersion()); new PropertyContext().Database.Initialize(true); 

我正在使用.net 4.5

为什么我在新数据库上出现此错误,如何使此网站正常工作?

刚刚在ASP.Net应用程序中遇到同样的错误。 在我的情况下,我没有使用Code First,但我使用标准的ASP.Net身份validation提供程序,显然使用Code First,并且由于此问题而导致身份validation被破坏。

这是快速而肮脏的解决方案,您不关心现有用户记录:

对我来说解决方案是删除dbo.__MigrationHistory表,之后认证开始正常工作。 意识到! 这个解决方案并不适合所有人! 这将解决问题,但它有潜在的风险。

如果您无法承担丢失AspNet *表中的数据:

ASP.Net身份validation提供程序自动在数据库中创建表:

  • AspNetRoles
  • AspNetUsers
  • AspNetUserRoles
  • AspNetUserClaims
  • AspNetUserLogings

默认情况下,表是空的,如果您没有为网站创建任何新登录,则可以使用上面的“快速和脏”解决方案。 如果您确实关心保留用户信息或只关注Code First迁移的工作方式,请按照下列步骤操作:

  • 打开Web.config文件并检查数据库的连接字符串的名称。 它将是元素下的记录之一。
  • 打开包管理器控制台:

    工具 – >库包管理器 – >包管理器控制台

  • 在“包管理器控制台”窗口中,使用下拉列表设置“默认项目”。 确保这是包含ASP.Net身份validation提供程序代码的项目。
  • 执行命令:
  Update-Database -ConnectionStringName MyConnectionStringName 

将MyConnectionStringName替换为您在web.config中查找的实际名称。

作为此命令的结果,您将看到一个新文件夹“Migrations”,其中包含由Update-Database命令生成的一堆代码。 重新构建和重新部署您的应用程序,您的新迁移代码将在启动时执行,并使数据库架构与ASP.Net身份validation提供程序代码的更新版本同步。

使用Code First with Migrations时,数据库会创建一个名为__MigrationHistory的表来跟踪当前架构。 运行应用程序时,Entity Framework将检查此表以确保数据库架构与数据库实体匹配。 如果它们不匹配,您将收到此错误。

要更新数据库,请按以下步骤操作:

  1. 在Visual Studio中打开包管理器控制台(视图 – >其他Windows – >包管理器控制台)
  2. 在程序包管理器控制台窗口中,有一个项目的下拉列表,确保将其设置为包含DbContext的项目
  3. 确保包含App.Config / Web.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(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文件的引用并不总是按照它们应该更新,这表明当我运行add-migration和update时,我的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. 让Entity Framework自动删除并根据新的模型类架构重新创建数据库。 在测试数据库上进行活动开发时,这种方法非常方便,因为它允许您快速将模型和数据库模式一起发展。 但缺点是,您丢失了数据库中的现有数据 – 因此您不希望在生产数据库中使用此方法!

  2. 显式修改现有数据库的模式,使其与模型类匹配。 这种方法的优点是您可以保留数据。 您可以手动或通过创建数据库更改脚本进行此更改。

我花了几个小时试图解决这个问题。 一个项目正在运作,另一个项目没有。

我有不同的项目引用不同版本的Entity Framework 。 就我而言,我有一个控制台应用程序和一个Windows服务应用程序,它们都引用了包含代码优先类和DbContext的第三个项目。

运行Update-Package EntityFramework一切都在两个项目中都运行良好。