至关重要;有没有办法为数据库优先EF模型定制复数服务?
具体来说,我想使用*Set
后缀表示法,其中实体集和集合导航属性相应地命名:
User
至UserSet
Report
至ReportSet
我知道我已经看到这可以通过代码优先实现,但是我坚持使用数据库优先作为开发过程。
我知道IPluralizationService
,但无法弄清楚如何替换我的自定义实现。
目前,我在模型浏览器(VS2015)中手动处理实体集和集合属性,并为每个属性添加“Set”;这样做很好,但每当我重新生成模型时,我的屁股就会变得非常痛苦。
有什么建议吗?
答案 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()
。