Entity Framework 6、Database-First & Custom Pluralization

Entity Framework 6, Database-First & Custom Pluralization

进入正题;有没有办法为数据库优先的 EF 模型定制复数化服务?

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

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

我知道 IPluralizationService,但不知道如何替换我的自定义实现。

目前,我正在模型浏览器 (VS2015) 中手动处理实体集和集合属性,并将 "Set" 附加到它们中的每一个;这样做一次很好,但是每当我重新生成模型时,它都会让我很痛苦。

有什么建议吗?

您可以编写将 edmx 文件更新为新名称的内容。 我还建议您可以更改 t4 脚本(.tt 文件),但我认为这会破坏数据库优先情况下与 edmx 文件的映射。

但我认为你应该先重新考虑代码,你可以多次使用代码优先生成器,只需清除上下文 class 和配置中的连接字符串并创建一个名为的新上下文相同(它将覆盖 table classes)。您可以 nuget EntityFramework.CodeTemplates.CSharp 并更改它下载的 t4 模板以包含 "Set",这就是它将用来生成 classes.

然后您就不会陷入 edmx 地狱,一旦您开始尝试维护 edmx 文件而不是让它们只是生成的内容,edmx 文件就会很痛苦。

我最终编写了一个脚本(PHP)来对 EDMX 文件执行 XML 转换。由于执行转换的方式,我失去了对一些更晦涩的功能的支持,但这是我在不牺牲小猫给无所不知的力量的情况下做到这一点的唯一方法。最重要的是,它按预期维护映射。

我还没有找到将转换脚本用于生成管道的方法;尽管我可能会考虑从文本模板中调用它。

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

在 EF6 中,您可以实施复数约定,并将默认的英语复数替换为您自己的复数。

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

唯一的警告是 GitHub 代码依赖于 internal 方法,您需要 copy/substitute,例如

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

替换原来的

model.StoreModel.GetEntitySet(item);

和方法 GetRootType().