我正在尝试在现有项目的 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/