自创建数据库以来,支持<mycontext>上下文的模型已更改。考虑使用Code First Migrations来更新数据库

时间:2015-07-09 04:09:59

标签: c# entity-framework ef-migrations

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

然后我在另一个项目中创建了一个单元测试,引用了数据层并运行它没有任何问题。当我向其中一个Code First类添加新属性时,问题就出现了。我再次运行了add-migrations和update-database,看到了SQL Server中反映出来的变化......到目前为止一直很好。 但是当我尝试在包含单元测试的项目中使用新类时,我得到以下异常:

  

“支持&lt; MyContext&gt;上下文的模型已经改变了   数据库已创建。考虑使用Code First Migrations进行更新   数据库“

...其中&lt; MyContext&gt;是我的上下文类。数据层库与数据库同步,为什么不能运行单元测试?

浏览stackoverflow后,我尝试添加:

Database.SetInitializer<MyContext>(null);

...它关闭了关于模型更改的异常,但随后又创建了一个新问题:

  

“无效的列名称'描述'。”

...其中“描述”是添加到数据层类(和新的SQL Server列)的新属性。

单元测试项目与数据层项目位于同一解决方案中,并具有对数据层dll的“项目”引用。

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

自从我第一次发布这个以来,我使用SQL Server Profiler来查看在SaveChanges()期间生成的SQL,并且该脚本将在SS Management Studio中按预期运行,这向我建议列名称没有任何问题,但这是DbUpdateException报告的内容。

4 个答案:

答案 0 :(得分:2)

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

所以,而不是使用

100..toString() // "100"
100 . toString() // "100"

Database.SetInitializer(null);

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

最佳,

答案 1 :(得分:1)

我在使用某种源代码控制的团队工作时已经看到了这种情况。一位开发人员将使EntityModel更改更新数据库,并且无法让其他人知道他们需要将最新代码删除。

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

答案 2 :(得分:1)

对于遇到“单元测试失败”且“上下文已更改”错误但其主应用程序正在运行的问题的任何人;对我而言,单元测试使用的是不同的连接字符串。要正确执行更新数据库,我在程序包控制台中使用了此命令:

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

答案 3 :(得分:0)

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

问题解决了