切中要害;有没有办法为数据库优先的EF模型定制多元化服务?
具体来说,我想使用*Set
后缀表示法,其中实体集和集合导航属性相应地命名:
-
User
到UserSet
-
Report
到ReportSet
- 等。
我知道我已经看到代码优先使这成为可能,但是我被数据库优先作为开发过程所困扰。
我知道IPluralizationService
,但不知道如何替代我的自定义实现。
目前,我正在手动通过模型浏览器(VS2015)中的实体集和集合属性工作,并将"Set"附加到它们每个;这样做一次很好,但是每当我重新生成模型时,它就变得非常痛苦。
有什么建议吗?
您可以编写一些内容,将edmx文件更新为新名称。此外,我还建议您可以更改t4脚本(.tt文件),但我认为这会在数据库优先的情况下破坏与edmx文件的映射。
但是我认为你应该首先重新考虑代码,你可以多次使用代码第一生成器,只是清理上下文类,并在配置中的连接字符串,并使一个新的上下文命名为相同(它将覆盖表类)。你可以打开entityframework . codetemplate . csharp,并修改它下载的t4个模板,使其包含"Set",这就是它将用来生成类的内容。
然后你就不会陷入edmx的地狱,一旦你开始尝试维护edmx文件,而不是让它们只是生成的,那么edmx文件就是一个痛苦。
我最后编写了一个脚本(所有的东西都是PHP)来对EDMX文件执行XML转换。由于执行转换的方式,我失去了对一些更模糊的功能的支持,但这是我在不牺牲小猫的情况下完成转换的唯一方法。最重要的是,它按预期维护映射。
我想不出一种方法来工作转换脚本到生成管道;不过我可能会考虑从文本模板中调用它。
我知道这个问题和它的答案是4年前的,但是:
在EF6中,您可以实现一个复数化约定,并将默认的英语复数化替换为您自己的。
最初的实现使用一个调用服务的约定。我不确定您是否可以简单地在DependencyResolver
中为IPluralizationService
注册服务,但您绝对可以编写自己的约定。
internal
方法,例如
var entitySet = model.StoreModel.Container.EntitySets.SingleOrDefault(
e => e.ElementType == GetRootType(item));
替换原
model.StoreModel.GetEntitySet(item);
和方法GetRootType()
.