c# - 现有项目中的实体类型未标记为虚拟

标签 c# entity-framework moq

我正在尝试在现有项目的 DbContext 中模拟(使用 Moq)DbSet,我认为该项目是从 VS 2012 升级的。我收到错误,这是因为那些 DbSet<> 未标记为虚拟的,所以他们不能被 mock 。当我查看我完成的新项目时,它们被标记为虚拟。

由于它位于 .edmx 文件中,因此我不能只将 virtual 添加到代码中,因为它是自动生成的。有谁知道我可以设置哪些属性来使它们虚拟?

最佳答案

在 EF6 中,默认情况下,DBSet 成员被创建为虚拟。这无法从配置中更改,但必须编辑 T4 模板(.tt 文件)。很可能有人之前编辑过它并删除了 virtual 关键字。

要查找 T4 模板,请在解决方案资源管理器中展开由 .edmx 文件创建的树。您将在其中找到一个 .tt 文件。

要使您的DBSet再次成为虚拟,您需要找到一个方法string DbSet(EntitySetEntitySet)(默认 .tt,第 307 行)。此方法创建一个属性声明,您可以在此处操作其模式。默认情况下,

"{0} virtual DbSet<{1}> {2} {{ get; set; }}"
使用了

。找到此模式的您的版本并将其更改为您喜欢的(或只是我提供的默认版本)。

编辑:如果您无法轻松找到此方法,请尝试搜索

DbSet<

编辑:编辑并保存.tt文件后,它应该自动执行。如果没有,请尝试右键单击它并选择“运行自定义工具”。

关于c# - 现有项目中的实体类型未标记为虚拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39727548/

相关文章:

.net - 如何模拟 IEnumerable<T> 以便我可以测试接收它的方法

c# - Powershell 自定义 cmdlet 在标准方法的实现之外调用 WriteVerbose

c# - Vector3.Projection 是什么意思?

asp.net-mvc - 使用 Entity Framework 6 和 ViewModel 从数据库表中填充 ASP.NET MVC 中的 DropDownList

c# - 如何告诉 EF 不要在 Code First 中更新引用类型属性?

.net - 包含在 linq to entity 中的条件

c# - 使用 Katalon 在运行时调用不同的环境配置

c# - 我可以随机而不是按顺序迭代 for 循环吗?

c# - Moq:如何获取传递给模拟服务方法的参数

c# - Moq 索引属性并在返回/回调中使用索引值