反向 POCO 生成器:如何重命名反向外键?

Posted

技术标签:

【中文标题】反向 POCO 生成器:如何重命名反向外键?【英文标题】:Reverse POCO Generator: How to Rename a Reverse Foreign Key? 【发布时间】:2018-10-27 07:12:18 【问题描述】:

我正在使用 Simon Hughes 的实体框架反向 POCO 生成器为我的 Sql Server 数据库生成代码优先的 EF 类。生成器是高度可配置的,我很清楚如何在关系的多对一侧重命名外键列。我不知道如何让生成器重命名反向关系。

例如,我有一个名为 Product_User 的表,其中包含一个名为 User_Info_ID 的列,该列引用表 USER_INFO。当我运行生成器时,User类中的一对多关系定义如下:

    /// <summary>
    /// Child ProductUsers where [Product_User].[User_Info_ID] point to this entity (FK_PRODUCT_USER_User)
    /// </summary>
    public virtual System.Collections.Generic.ICollection<ProductUser> User1  get; set;  // Product_User.FK_PRODUCT_USER_User

如何让它生成这个?

    public virtual System.Collections.Generic.ICollection<ProductUser> UserProducts  get; set;  

【问题讨论】:

更正:我在 Settings.ForeignKeyName = (tableName, foreignKey, foreignKeyName, relationship, attempt) 中包含的覆盖负责生成“User1”作为反向导航名称。纠正我的错误后,它生成“ProductUsers”作为反向 FK 名称。我仍然不知道如何将反向导航重命名为“UserProducts”。 【参考方案1】:

反向 POCO 项目使用代码文本模板生成代码。负责生成类的列名和属性名的 tt 将在 EF.Reverse.POCO.Core.ttinclude 中

GetUniqueColumnName 通过一系列步骤来获得名称。它可能存在唯一的名称冲突,这就是它对列名称进行排序/序列化的原因,其末尾带有 1。

我附上了这个过程的图片。您还可以在控制台中写入一些内容,并在保存 database.tt 时观察输出窗口以查看发生了什么。

This is the screenshot of the EF.Reverse.POCO.core.ttinclude

【讨论】:

【参考方案2】:

在 *.tt 文件的内部

Settings.ForeignKeyName = (tableName, foreignKey, foreignKeyName, relationship, attempt) => 

    if (foreignKey.PkTableName == "USER_INFO" && foreignKey.FkTableName == "Product_User" 
        && foreignKey.FkColumn == "User_Info_ID" && relationship == Relationship.OneToMany)
        return "UserProducts";


foreignKey 参数的属性具有出现在数据库模式中的值,而不是生成器的驼峰式输出。通过在 *.tt 文件中设置断点并通过在 VS.NET 解决方案资源管理器中右键单击 *.tt 文件来调用 [Debug T4 Template],我发现了这一点。

【讨论】:

以上是关于反向 POCO 生成器:如何重命名反向外键?的主要内容,如果未能解决你的问题,请参考以下文章

EF Code First 重命名生成的 POCO 类中的属性

3小时找hibernate反向生成类为什么没有生成外键

命名URL和URL反向解析

带有嵌套序列化程序的 Django 反向外键给出了多个结果

如何关闭 Play! 的 javascript 反向路由生成?

如何使用myeclipse反向生成实体类