我在第762次遇到此错误,但这次我尝试访问我的生产网站后立即获取该错误,直接删除Azure上的“生产”数据库,然后发布我的网站。
The model backing the 'PropertyContext' context has changed since the database was created. Consider using Code First Migrations to update the database
我删除了数据库,因为我无法以任何其他方式修复此问题,但它仍然无效。
一些要点:
我在Global.asax(两个项目中)中尝试了以下内容
Database.SetInitializer PropertyContext>(null); < - SO不会让我把第一个<
和
Database.SetInitializer(new MigrateDatabaseToLatestVersion<PropertyContext, MyConfiguration>());
new PropertyContext().Database.Initialize(true);
我正在使用.net 4.5
为什么我在新数据库上收到此错误,如何才能使此网站正常工作?
答案 0 :(得分:35)
在ASP.Net应用程序中遇到同样的错误。在我的情况下,我没有使用Code First,但我使用标准的ASP.Net身份验证提供程序,显然使用Code First,并且由于此问题而导致身份验证被破坏。
对我来说,解决方案是删除dbo.__MigrationHistory
表,之后认证开始正常工作。 请注意!此解决方案并非适合所有人!这将解决问题,但它有潜在的风险。
ASP.Net身份验证提供程序会自动在您的数据库中创建表:
默认情况下,这些表是空的,如果您没有为您的网站创建任何新登录信息,则可以使用&#34;快速且脏的&#34;解决方案如上如果您确实关心保留用户信息或只关注Code First迁移的工作原理,请按照以下步骤操作:
<connectionStrings>
元素下的记录之一。打开软件包管理器控制台:
工具 - &gt;库包管理器 - &gt;包管理器控制台
Update-Database -ConnectionStringName MyConnectionStringName
将MyConnectionStringName替换为您在web.config中查找的实际名称。
作为此命令的结果,您将看到一个新文件夹&#34; Migrations&#34;使用Update-Database
命令生成的一堆代码。重新构建和重新部署您的应用程序,您的新迁移代码将在启动时执行,并使数据库架构与ASP.Net身份验证提供程序代码的更新版本同步。
答案 1 :(得分:27)
将Code First与迁移一起使用时,数据库会创建一个名为__MigrationHistory
的表来跟踪当前架构。运行应用程序时,Entity Framework将检查此表以确保数据库模式与数据库实体匹配。如果它们不匹配,您将收到此错误。
要更新数据库,请按以下步骤操作:
DbContext
App.Config
/ Web.Config
文件的项目为“设置为启动项目”(如果您有多个配置,则必须是定义了数据库连接字符串的配置。< / LI>
Update-Database -ConnectionStringName MyConnString
/ MyConnString
<中键入App.Config
,其中Web.Config
是名称(不是实际连接字符串)的连接字符串/ LI>
醇>
如果出现这样的错误:“无法更新数据库以匹配当前模型,因为存在挂起的更改并且已禁用自动迁移。”
您应启用自动迁移,然后重试。 启用自动迁移
Migrations
文件夹中(在包含DbContext
的项目中),打开Configuration.cs
。AutomaticMigrationsEnabled = true;
要阻止Entity Framework / DbContext监视数据库上的更改,您只需删除数据库中的__MigrationHistory
表即可。然后由您决定数据库是否仍然手动更新。
答案 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
(里克安德森) 有两种方法可以解决错误:
让Entity Framework自动删除并根据新的模型类架构重新创建数据库。在测试数据库上进行活动开发时,这种方法非常方便,因为它允许您快速将模型和数据库模式一起发展。但缺点是您丢失了数据库中的现有数据 - 因此您不希望在生产数据库中使用此方法!
显式修改现有数据库的模式,使其与模型类匹配。这种方法的优点是可以保存数据。您可以手动或通过创建数据库更改脚本进行此更改。
答案 5 :(得分:0)
我花了几个小时试图解决这个问题。一个项目正在运作,另一个项目没有。
我有不同的项目引用Entity Framework
的不同版本。就我而言,我有一个控制台应用程序和一个 Windows服务应用程序,它们都引用了包含代码优先类和DbContext
的第三个项目。
运行Update-Package EntityFramework
之后,两个项目都运行良好。