自创建数据库以来,支持'MyDbContext'上下文的模型已更改。考虑使用Code First Migrations来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。
是什么导致这种情况发生?我真的只是创建了一个全新的数据库并且什么都没改变,但每次我尝试从控制器访问一个模型时都会抛出这个。
修改
这与我试图与两个独立实体共享连接字符串(即数据库)这一事实有关。
答案 0 :(得分:36)
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>());
一旦您开始投入生产并且不想再丢失数据,那么您将删除此初始化程序,而是使用数据库迁移,以便您可以在不丢失数据的情况下部署更改。
答案 1 :(得分:31)
在我的情况下,此错误是由数据库中存在_MigrationsHistory表引起的。删除该表可以解决问题。不确定该表如何进入我们的测试环境数据库。
答案 2 :(得分:28)
要解决此错误,请在Global.asax.cs文件中的Application_Start()方法中编写以下代码
Database.SetInitializer<MyDbContext>(null);
答案 3 :(得分:7)
如果您对上下文进行了更改,并且想要手动对DB进行相关更改(或保持原样),则会有一种快速而肮脏的方式。
转到数据库,然后从“_MigrationHistory”表中删除所有内容
答案 4 :(得分:5)
最简单,最安全的方法 如果您知道您确实想要更改/更新数据结构,以便数据库可以与您的DBContext同步,那么最安全的方法是:
这告诉EF对数据库进行更改,使其与您的DBContext数据结构匹配
答案 5 :(得分:1)
当表格结构和模型类不再同步时会发生这种情况。您需要根据模型类更新表结构,反之亦然 - 这是您的数据很重要且不得删除的时间。如果您的数据结构已更改且数据对您不重要,则可以在全局中添加以下代码,以使用DropCreateDatabaseIfModelChanges
功能(以前称为“RecreateDatabaseIfModelChanges
”功能) .asax.cs 强>:
Database.SetInitializer<MyDbContext>(new DropCreateDatabaseIfModelChanges<MyDbContext>());
再次运行您的应用程序。
顾名思义,这将删除您的数据库并根据您最新的模型类(或类)重新创建 - 前提是您认为模型类中的表结构定义是最新的和最新的;否则改变模型类的属性定义。
答案 6 :(得分:1)
如果您使用已存在的表更改了模型和数据库,并且收到错误“模型支持数据库上下文已更改;请考虑代码优先迁移”,您应该:
pm>update-database -Verbose
答案 7 :(得分:1)
实体框架检测到有关模型已更改的内容,您需要对数据库执行某些操作才能使其工作。解决方案: 1 。 enable-migrations 2 。更新的数据库
答案 8 :(得分:1)
只需转到程序包管理控制台,输入以下内容:
启用迁移
*如果出现这样的错误“由于存在挂起的更改并且自动迁移被禁用,因此无法更新数据库以匹配当前模型。要么将挂起的模型更改写入基于代码的迁移,要么启用自动迁移。”
执行此操作>>> 添加迁移
* Visual Studio会要求输入名称,请输入您想要的名称。
更新数据库
答案 9 :(得分:1)
您可以通过删除在数据库中自动创建的__MigrationHistory
表并使用代码优先迁移将所有更新记录在数据库中来解决此问题。在这种情况下,在这种情况下,您手动更改了数据库,而EF则假定必须使用迁移工具来进行此操作。对EF删除表意味着没有更新,也不需要进行代码优先的迁移,因此工作正常。
答案 10 :(得分:0)
你需要相信我。 我收到此错误的原因很简单,我忘了在你的启动项目的App.Config(我的是一个wpf项目)中添加连接字符串。
我的情况下的整个配置
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings>
<add name="ZzaDbContext" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=ZaaDbInDepth;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" providerName="System.Data.SqlClient"/>
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
答案 11 :(得分:0)
当数据库与模型不同步时发生此错误,反之亦然。要解决此问题,请执行以下步骤-
a)使用 add-migration <{Migration File Name}> 通过 nuget软件包管理器控制台。此迁移文件将具有脚本来同步Db和代码之间不同步的任何内容。
b)使用 update-database 命令更新数据库。这将更新 数据库,其中包含模型中的最新更改。
如果这样做没有帮助,请在Global.asax.cs文件的Application_Start方法中添加代码行后尝试以下步骤-
Database.SetInitializer<VidlyDbContext>(new DropCreateDatabaseIfModelChanges<VidlyDbContext>());
答案 12 :(得分:0)
将其添加为另一种可能的解决方案,因为在我们的案例中这已解决了该问题;
请确保您有多个项目使用相同的Entity Framework Nuget软件包版本!。
在我们的例子中,我们有一个项目(如果为项目A,则称为),其中包含所有实体的EF代码优先上下文。我们正使用该项目来添加迁移和更新数据库。 但是,第二个项目(B)正在引用项目A以利用上下文。运行该项目时,我们遇到了相同的错误;
自创建数据库以来,支持“ MyDbContext”上下文的模型已更改。考虑使用代码优先迁移来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。
答案 13 :(得分:-1)
通过添加新迁移解决了这个问题。键入 Add-Migration MigrationName。然后通过键入 Update-Database 来更新数据库。