实体框架6,数据库优先&自定义多元化

时间:2016-11-16 04:30:50

标签: c# entity-framework ef-database-first pluralize

至关重要;有没有办法为数据库优先EF模型定制复数服务?

具体来说,我想使用*Set后缀表示法,其中实体集和集合导航属性相应地命名:

  • UserUserSet
  • ReportReportSet

我知道我已经看到这可以通过代码优先实现,但是我坚持使用数据库优先作为开发过程。

我知道IPluralizationService,但无法弄清楚如何替换我的自定义实现。

目前,我在模型浏览器(VS2015)中手动处理实体集和集合属性,并为每个属性添加“Set”;这样做很好,但每当我重新生成模型时,我的屁股就会变得非常痛苦。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

您可以编写将edmx文件更新为新名称的内容。 另外我建议你可以改变t4脚本(.tt文件),但我认为这将在数据库的第一种情况下破坏与edmx文件的映射。

但我认为你应该首先重新考虑代码,你可以多次使用代码第一个生成器,只需清理上下文类,然后在配置中创建一个连接字符串,并创建一个名为相同的新上下文(它将覆盖表类)。您可以修改EntityFramework.CodeTemplates.CSharp并更改它下载的t4模板以包含" Set"这就是它将用于生成类的内容。

然后你不会陷入edmx地狱,一旦你开始尝试维护它们而不是让它们成为生成的东西,edmx文件会很痛苦。

答案 1 :(得分:0)

我最终编写了一个脚本(所有东西的PHP)来在EDMX文件上执行XML转换。由于转换的执行方式,我失去了对一些更加模糊的功能的支持,但是这是我能够做到的唯一方式,而不会牺牲小猫的无所不知的力量。最重要的是,它保持了预期的映射。

我无法找到将转换脚本用于生成管道的方法;虽然我可以考虑从文本模板中调用它。

答案 2 :(得分:0)

我知道这个问题及其答案已有 4 年历史,但是:

在 EF6 中,您可以实现复数约定,并用您自己的复数形式替换默认的英文复数形式。

原始实现使用 convention,它调用 service。我不确定您是否可以简单地在 IPluralizationService 中为 DependencyResolver 注册服务,但您绝对可以编写自己的约定。

唯一的警告是 GitHub 代码依赖于您需要复制/替换的 internal 方法,例如

var entitySet = model.StoreModel.Container.EntitySets.SingleOrDefault(
                    e => e.ElementType == GetRootType(item));

替换原版

model.StoreModel.GetEntitySet(item);

和方法GetRootType()