实体框架6、数据库优先自定义多元化的案例

本文关键字:自定义 多元化 案例 框架 数据库 实体 | 更新日期: 2023-09-27 18:18:02

切中要害;有没有办法为数据库优先的EF模型定制多元化服务?

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

  • UserUserSet
  • ReportReportSet
  • 等。

我知道我已经看到代码优先使这成为可能,但是我被数据库优先作为开发过程所困扰。

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

目前,我正在手动通过模型浏览器(VS2015)中的实体集和集合属性工作,并将"Set"附加到它们每个;这样做一次很好,但是每当我重新生成模型时,它就变得非常痛苦。

有什么建议吗?

实体框架6、数据库优先自定义多元化的案例

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

但是我认为你应该首先重新考虑代码,你可以多次使用代码第一生成器,只是清理上下文类,并在配置中的连接字符串,并使一个新的上下文命名为相同(它将覆盖表类)。你可以打开entityframework . codetemplate . csharp,并修改它下载的t4个模板,使其包含"Set",这就是它将用来生成类的内容。

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

我最后编写了一个脚本(所有的东西都是PHP)来对EDMX文件执行XML转换。由于执行转换的方式,我失去了对一些更模糊的功能的支持,但这是我在不牺牲小猫的情况下完成转换的唯一方法。最重要的是,它按预期维护映射。

我想不出一种方法来工作转换脚本到生成管道;不过我可能会考虑从文本模板中调用它。

我知道这个问题和它的答案是4年前的,但是:

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

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

唯一的警告是GitHub代码依赖于你需要复制/替换的internal方法,例如
var entitySet = model.StoreModel.Container.EntitySets.SingleOrDefault(
                    e => e.ElementType == GetRootType(item));

替换原

model.StoreModel.GetEntitySet(item);

和方法GetRootType() .