MyContext>自创建数据库以来,上下文已发生更改.考虑使用代码优先迁移来更新数据库

本文关键字:数据库 代码 更新 迁移 创建 上下文 MyContext | 更新日期: 2023-09-27 18:01:39

我有一个数据层,使用Code First与EF 6.0.0.0,我使用Fluent API。我运行了enable-migrations、add-migrations和update-database,并在SQL Server中创建了数据库。

然后我在另一个项目中创建了一个引用数据层的单元测试,并运行它没有任何问题。当我向其中一个Code First类添加新属性时,问题就开始了。我再次运行了添加-迁移和更新-数据库,看到了SQL Server中反映的变化……到目前为止一切顺利。但是,当我尝试在包含单元测试的项目中使用新类时,我得到以下异常:

"支持上下文发生了变化数据库已创建。考虑使用代码优先迁移进行更新数据库"

…在& lt; MyContext>是我的上下文类。数据层库与数据库是同步的,那么为什么不能运行单元测试呢?

查看stackoverflow后,我尝试添加:

Database.SetInitializer<MyContext>(null);

…这就排除了模型变化的异常,但又产生了一个新问题:

"无效的列名'Description'。"

…其中"Description"是添加到数据层类(以及新的SQL Server列)的新属性。

单元测试项目与数据层项目处于相同的解决方案中,并且对数据层dll有一个"项目"引用。

为什么EF认为数据模型和数据库不同步?为什么它认为"描述"是一个无效的列名?当然,我真正想知道的是如何让它工作?

自从我第一次发布这篇文章以来,我使用SQL Server Profiler来查看SaveChanges()期间生成的SQL,脚本将按预期在SS Management Studio中运行,这表明我对列名没有任何错误,但这就是DbUpdateException报告的内容。

MyContext>自创建数据库以来,上下文已发生更改.考虑使用代码优先迁移来更新数据库

我猜在单元测试项目中使用的数据库,从项目的app.config中获取它的连接字符串,与在webapp项目中使用的数据库不一样,从项目的web.config中获取它的连接字符串。

所以,不用

Database.SetInitializer(null);

Database.SetInitializer(new MigrateDatabaseToLatestVersion<{YourDbContext}, Configuration>());

您可以查看:https://msdn.microsoft.com/en-us/data/jj591621.aspx#initializer

,

在使用某种源代码控制的团队中工作时,我看到过这种情况。一个开发人员会更改EntityModel更新数据库,而不让其他人知道他们需要拉下最新的代码。

在您的情况下,如果只有您一个人,我建议您清除单元测试的BIN文件夹,然后重新编译。听起来它为单元测试项目复制的DLL可能不是最新的。

对于任何遇到单元测试失败的人来说,"上下文已更改"错误,但他们的主要应用程序正在工作;对我来说,这是因为单元测试使用了不同的连接字符串。为了正确执行更新数据库,我在包控制台使用了以下命令:

update-database -ProjectName MyProj.EntityFramework -StartUpProjectName MyProj.IntegrationTests -Verbose

您需要做的就是删除从模型生成的表。此外,确保也删除了_MigrationHistory表。然后重新运行代码。

问题解决了