我有一个使用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中反映出来的变化......到目前为止一直很好。 但是当我尝试在包含单元测试的项目中使用新类时,我得到以下异常:
“支持< MyContext>上下文的模型已经改变了 数据库已创建。考虑使用Code First Migrations进行更新 数据库“
...其中< MyContext>是我的上下文类。数据层库与数据库同步,为什么不能运行单元测试?
浏览stackoverflow后,我尝试添加:
Database.SetInitializer<MyContext>(null);
...它关闭了关于模型更改的异常,但随后又创建了一个新问题:
“无效的列名称'描述'。”
...其中“描述”是添加到数据层类(和新的SQL Server列)的新属性。
单元测试项目与数据层项目位于同一解决方案中,并具有对数据层dll的“项目”引用。
为什么EF认为数据模型和数据库不同步?为什么它认为'Description'是一个无效的列名?但当然,我真正想知道的是如何使这个工作?
自从我第一次发布这个以来,我使用SQL Server Profiler来查看在SaveChanges()期间生成的SQL,并且该脚本将在SS Management Studio中按预期运行,这向我建议列名称没有任何问题,但这是DbUpdateException报告的内容。
答案 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
表。然后重新运行您的代码。
问题解决了