自创建数据库以来,支持“MyDbContext”上下文的模型已更改。考虑使用 Code First 迁移来更新数据库 ( http://go.microsoft.com/fwlink/?LinkId=238269 )。
是什么导致这种情况发生?我实际上只是创建了一个全新的数据库并且没有进行任何更改,但是每次我尝试从控制器访问模型时都会抛出这个。
编辑
这与我试图与两个单独的实体共享连接字符串(即数据库)这一事实有关。
自创建数据库以来,支持“MyDbContext”上下文的模型已更改。考虑使用 Code First 迁移来更新数据库 ( http://go.microsoft.com/fwlink/?LinkId=238269 )。
是什么导致这种情况发生?我实际上只是创建了一个全新的数据库并且没有进行任何更改,但是每次我尝试从控制器访问模型时都会抛出这个。
编辑
这与我试图与两个单独的实体共享连接字符串(即数据库)这一事实有关。
就我而言,此错误是由数据库中存在 _MigrationsHistory 表引起的。删除该表解决了这个问题。不确定该表是如何进入我们的测试环境数据库的。
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>());
一旦您投入生产并且不再希望丢失数据,那么您将删除此初始化程序并改为使用数据库迁移,以便您可以在不丢失数据的情况下部署更改。
要解决此错误,请在 Global.asax.cs 文件的 Application_Start() 方法中编写以下代码
Database.SetInitializer<MyDbContext>(null);
如果您对上下文进行了更改,并且想要手动对 DB 进行相关更改(或保持原样),则有一种快速而肮脏的方法。
转到数据库,并从“_MigrationHistory”表中删除所有内容
最简单和最安全的方法 如果您知道您确实想要更改/更新您的数据结构,以便数据库可以与您的 DBContext 同步,最安全的方法是:
这告诉 EF 对您的数据库进行更改,以使其与您的 DBContext 数据结构相匹配
只需转到包管理控制台,键入以下内容:
启用迁移
*如果出现这样的错误“无法更新数据库以匹配当前模型,因为有待处理的更改并且自动迁移已禁用。将待处理的模型更改写入基于代码的迁移或启用自动迁移。”
执行此操作 >>>添加迁移
*Visual Studio 会询问名称,请输入您想要的名称。
更新数据库
将此添加为另一种可能的解决方案,因为这是在我们的案例中解决的问题;
确保您是否有多个项目使用相同的实体框架 Nuget 包版本!。
在我们的例子中,我们有一个项目(如果项目 A 则调用)包含所有实体的 EF 代码第一个上下文。我们使用这个项目来添加迁移和更新数据库。但是,第二个项目 ( B ) 正在引用项目 A 以利用上下文。运行这个项目时,我们遇到了同样的错误;
自创建数据库以来,支持“MyDbContext”上下文的模型已更改。考虑使用 Code First 迁移来更新数据库 ( http://go.microsoft.com/fwlink/?LinkId=238269 )。
您可以通过删除__MigrationHistory
在数据库中自动创建的表并使用代码优先迁移记录数据库中的任何更新来解决此问题。在这里,在这种情况下,您手动更改了数据库,而 EF 假设您必须使用迁移工具进行更改。删除表对 EF 意味着没有更新,也不需要进行代码优先迁移,因此它工作得很好。
当您的数据库与您的模型不同步时会发生此错误,反之亦然。要克服这个问题,请按照以下步骤操作 -
a)通过 nuget 包管理器控制台使用add-migration <{Migration File Name}> 添加迁移文件。此迁移文件将包含用于同步 Db 和代码之间不同步的任何内容的脚本。
b) 使用update-database命令更新数据库。这将使用模型中的最新更改更新数据库。
如果这没有帮助,请在 Global.asax.cs 文件的 Application_Start 方法中添加代码行后尝试这些步骤 -
Database.SetInitializer<VidlyDbContext>(new DropCreateDatabaseIfModelChanges<VidlyDbContext>());
当您的表结构和模型类不再同步时,就会发生这种情况。您需要根据模型类更新表结构,反之亦然——这是您的数据很重要且不能删除的时候。如果您的数据结构已更改并且数据对您不重要,则可以通过在Global.asax.cs中添加以下代码来使用该DropCreateDatabaseIfModelChanges
功能(以前称为“ ”功能) :RecreateDatabaseIfModelChanges
Database.SetInitializer<MyDbContext>(new DropCreateDatabaseIfModelChanges<MyDbContext>());
再次运行您的应用程序。
顾名思义,这将删除您的数据库并根据您的最新模型类(或类)重新创建——前提是您相信模型类中的表结构定义是最新和最新的;否则更改模型类的属性定义。
如果您使用已存在的表更改了模型和数据库,并且收到错误“支持数据库上下文的模型已更改;考虑代码优先迁移”,您应该:
pm>update-database -Verbose
实体框架检测到模型发生了一些变化,你需要对数据库做一些事情来完成这项工作。解决方案:1。启用迁移2。更新数据库
你需要相信我。我收到此错误的原因很简单,因为我忘记在您的启动项目的 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>
如果您使用身份,可能您的上下文名称与migrationHistory last record context Key 不同。因此,您需要在这部分代码中使用 ContextKey 中的新名称更改名称:
Database.SetInitializer<ContextName>(null);