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

时间:2014-02-18 11:18:01

标签: c# entity-framework azure

我在第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<PropertyContext, MyConfiguration>());
new PropertyContext().Database.Initialize(true);

我正在使用.net 4.5

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

6 个答案:

答案 0 :(得分:35)

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

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

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

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

ASP.Net身份验证提供程序会自动在您的数据库中创建表:

  • AspNetRoles
  • AspNetUsers
  • AspNetUserRoles
  • AspNetUserClaims
  • AspNetUserLogings

默认情况下,这些表是空的,如果您没有为您的网站创建任何新登录信息,则可以使用&#34;快速且脏的&#34;解决方案如上如果您确实关心保留用户信息或只关注Code First迁移的工作原理,请按照以下步骤操作:

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

    工具 - &gt;库包管理器 - &gt;包管理器控制台

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

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

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

答案 1 :(得分:27)

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

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

  1. 在Visual Studio中打开程序包管理器控制台(查看 - &gt;其他Windows - &gt;程序包管理器控制台)
  2. 在程序包管理器控制台窗口中,有一个项目的下拉列表,请确保将其设置为包含DbContext
  3. 的项目
  4. 确保包含App.Config / Web.Config文件的项目为“设置为启动项目”(如果您有多个配置,则必须是定义了数据库连接字符串的配置。< / LI>
  5. Update-Database -ConnectionStringName MyConnString / MyConnString <中键入App.Config,其中Web.Config名称(不是实际连接字符串)的连接字符串/ LI>

    如果出现这样的错误:“无法更新数据库以匹配当前模型,因为存在挂起的更改并且已禁用自动迁移。”

    您应启用自动迁移,然后重试。 启用自动迁移

    1. Migrations文件夹中(在包含DbContext的项目中),打开Configuration.cs
    2. 确保构造函数包含:AutomaticMigrationsEnabled = true;
    3. 要阻止Entity Framework / DbContext监视数据库上的更改,您只需删除数据库中的__MigrationHistory表即可。然后由您决定数据库是否仍然手动更新。

      MSDN article here

答案 2 :(得分:7)

这个解决方案是使用静态方法SetInitializer并将上下文绑定为Null值。如果您正在使用Web解决方案,那么编写代码的最佳位置是在Global.asax.cs文件的Application_Start中。

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

答案 3 :(得分:3)

今天早上我遇到了类似的问题。突然出现错误,无法解决:

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。

答案 4 :(得分:1)

遇到了类似的问题!答案在这里 http://www.asp.net/mvc/overview/older-versions/getting-started-with-aspnet-mvc3/cs/adding-a-new-field

(里克安德森) 有两种方法可以解决错误:

  1. 让Entity Framework自动删除并根据新的模型类架构重新创建数据库。在测试数据库上进行活动开发时,这种方法非常方便,因为它允许您快速将模型和数据库模式一起发展。但缺点是您丢失了数据库中的现有数据 - 因此您不希望在生产数据库中使用此方法!

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

答案 5 :(得分:0)

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

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

运行Update-Package EntityFramework之后,两个项目都运行良好。