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

stu*_*net 24 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
Run Code Online (Sandbox Code Playgroud)

我删除了数据库,因为我无法以任何其他方式修复此问题,但它仍然无法正常工作.

一些要点:

  • 我正在使用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);
Run Code Online (Sandbox Code Playgroud)

我正在使用.net 4.5

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

sev*_*tov 36

刚刚在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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 非常感谢你,我浪费了很多时间在这个愚蠢的问题上,然后通过删除这个愚蠢的dbo来解决它.__ MigrationHistory表再次感谢我的朋友 (2认同)
  • 先生,你今天是个英雄. (2认同)

Tal*_*lon 27

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

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

  1. 在Visual Studio中打开包管理器控制台(视图 - >其他Windows - >包管理器控制台)
  2. 在程序包管理器控制台窗口中,有一个项目的下拉列表,确保将其设置为包含您的项目的项目 DbContext
  3. 确保包含App.Config/ Web.Configfile 的项目是"Set as Startup Project"(如果您有多个Configs,则必须是定义了数据库连接字符串的项目).
  4. 类型Update-Database -ConnectionStringName MyConnString,其中MyConnString名称的连接字符串(而不是实际的连接字符串)在你的App.Config/Web.Config

如果您收到如下错误:"无法更新数据库以匹配当前模型,因为存在挂起的更改并且已禁用自动迁移."

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

  1. Migrations文件夹中(与您的项目中DbContext),打开Configuration.cs.
  2. 确保构造函数包含: AutomaticMigrationsEnabled = true;

要阻止Entity Framework/DbContext监视数据库上的更改,您只需删除__MigrationHistory数据库中的表即可.然后由您决定数据库是否仍然手动更新.

MSDN文章在这里


Mha*_*nis 7

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

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