实体类型在现有项目中未标记为虚拟

Entity Types aren't marked virtual in existing project

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

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

在 EF6 中,默认情况下,DBSet 个成员创建为 virtual。这不能从配置中更改,但必须编辑 T4 模板(.tt 文件)。很可能之前有人对其进行了编辑并删除了 virtual 关键字。

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

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

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

已使用。找到此模式的版本并根据自己的喜好进行更改(或者只是我提供的默认版本)。

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

DbSet<

编辑:编辑并保存.tt文件后,应该会自动执行。如果没有,请尝试右键单击它并选择 'Run Custom Tool'.