支持DB Context的模型已经改变; 考虑代码优先迁移

Bri*_*n D 48 asp.net-mvc entity-framework

自创建数据库以来,支持"MyDbContext"上下文的模型已更改.请考虑使用"代码优先迁移"来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269).

是什么导致这种情况发生?我真的只是创建了一个全新的数据库并且什么都没改变,但每次我尝试从控制器访问一个模型时都会抛出这个.

编辑

它与我试图与两个独立实体共享连接字符串(即数据库)这一事实有关.

Aar*_*nLS 40

EF codefirst将查看您的DbContext,并发现在其中声明的所有实体集合(并且还通过导航属性查看与这些实体相关的实体).然后,它将查看您为其提供连接字符串的数据库,并确保其中的所有表都与模型中实体的结构相匹配.如果它们不匹配,则它无法读/写这些表.无论何时创建新数据库,或者更改了有关实体类声明的内容(例如添加属性或更改数据类型),它都会检测到模型和数据库不同步.默认情况下,它只会给您上述错误.通常在开发期间,您希望发生的事情是重新创建数据库(擦除任何数据)并从新的模型结构中再次生成.

为此,请参阅本文中的"RecreateDatabaseIfModelChanges功能":http: //weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

您基本上需要提供一个继承自DropCreateDatabaseIfModelChanges的数据库初始化程序(现在不推荐使用RecreateDatabaseIfModelChanges).为此,只需将此行添加到文件的Application_Start方法中即可Global.asax.

Database.SetInitializer<NameOfDbContext>(new DropCreateDatabaseIfModelChanges<NameOfDbContext>());
Run Code Online (Sandbox Code Playgroud)

一旦您开始生产并且不再想丢失数据,那么您将删除此初始化程序,而是使用数据库迁移,以便您可以在不丢失数据的情况下部署更改.

  • `RecreateDatabaseIfModelChanges`现在是`DropCreateDatabaseIfModelChanges`:[见这篇文章](http://forums.asp.net/t/1794419.aspx?Cannot+find+RecreateDatabaseIfModelChanges). (4认同)

Cra*_*her 35

在我的情况下,此错误是由数据库中存在_MigrationsHistory表引起的.删除该表可以解决问题.不确定该表如何进入我们的测试环境数据库.

  • 这对我来说是最快的解决方案。我在表中添加了 1 个新的 `bit` 列,并在我的 C# 模型中添加了一个相应的属性。我不想删除所有数据并重置所有内容,所以我只是删除了这个 _Migrations 历史表,它在 C# 中选择了新列就好了。 (2认同)
  • 解决了我的问题。谢谢 (2认同)

Sid*_*Sid 29

要解决此错误,请在Global.asax.cs文件中的Application_Start()方法中编写以下代码

Database.SetInitializer<MyDbContext>(null);
Run Code Online (Sandbox Code Playgroud)

  • 这是解决问题还是只是隐藏症状? (23认同)
  • 当使用 context.Entities.SqlQuery("") 调用存储过程时,这个答案特别有用。 (2认同)

Ill*_*dan 8

如果您对上下文进行了更改,并且您希望手动对DB进行相关更改(或保留原样),则会有一种快速而肮脏的方式.

转到DB,并从"_MigrationHistory"表中删除所有内容


Pho*_*nic 5

最简单,最安全的方法 如果您知道您确实想要更改/更新数据结构,以便数据库可以与您的DBContext同步,那么最安全的方法是:

  1. 打开Package Manager控制台
  2. 键入:update-database -verbose -force

这告诉EF对数据库进行更改,使其与您的DBContext数据结构相匹配