【问题标题】:The model backing the <MyContext> context has changed since the database was created. Consider using Code First Migrations to update the database自创建数据库以来,支持 <MyContext> 上下文的模型已更改。考虑使用 Code First 迁移来更新数据库
【发布时间】:2015-07-09 04:09:58
【问题描述】:

我有一个使用 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 中反映的更改......到目前为止一切都很好。 但是当我尝试在包含单元测试的项目中使用新类时,出现以下异常:

"支持 上下文的模型自 数据库已创建。考虑使用 Code First 迁移来更新 数据库”

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

查看stackoverflow后,我尝试添加:

Database.SetInitializer<MyContext>(null);

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

“列名‘描述’无效。”

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

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

为什么EF认为数据模型和数据库不同步?为什么它认为“描述”是无效的列名?但当然,我真正想知道的是如何让它发挥作用?

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

【问题讨论】:

  • 请使用代码标记以提高您问题的可读性。
  • 以防万一问题与单元测试框架有关,我创建了一个存根控制台应用程序来使用数据层但得到了相同的行为。

标签: c# entity-framework entity-framework-migrations


【解决方案1】:

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

所以,不要使用

Database.SetInitializer(null);

试试

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

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

最好的,

【讨论】:

  • 感谢您的回复。我检查了您提到的链接并尝试了更改,但我仍然收到“无效的列名”异常。迁移已经在数据库中创建了列,所以我怀疑迁移没有问题。
  • 您能否发布 web.config 的连接字符串部分用于 Web 应用程序和 app.config 用于单元测试,以及 DbContext 的初始化代码?另请查看:msdn.microsoft.com/en-us/data/jj592674.aspx
  • 顺便说一句,最好升级到最新的EF!
【解决方案2】:

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

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

【讨论】:

  • 感谢您的建议。我尝试过,但遇到了同样的问题:“上下文已更改”异常或“列名无效”异常。数据层类中的新属性显示在单元测试项目中的智能感知中,并且一切都编译正常,这向我表明引用和 dll 是正常的。
【解决方案3】:

对于遇到单元测试失败并出现“上下文已更改”错误但他们的主应用程序正在运行的问题的任何人;对我来说,单元测试使用了不同的连接字符串。为了正确执行更新数据库,我从包控制台使用了这个命令:

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

【讨论】:

    【解决方案4】:

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

    问题解决了

    【讨论】:

      猜你喜欢
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多