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

Reverse POCO Generator: How to Rename a Reverse Foreign Key?

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

例如,我有一个名为 Product_User 的 table,其中有一个名为 User_Info_ID 的列引用了 table USER_INFO。当我运行生成器时,Userclass中的一对多关系定义如下:

    /// <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; } 

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

GetUniqueColumnName 通过一系列步骤获得名称。它可能存在唯一的名称冲突,这就是为什么它 sequences/serializes 列名称末尾带有 1。

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

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

在 *.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 参数的属性具有出现在数据库模式中的值,而不是生成器的 camel-case 友好输出。我通过在 *.tt 文件中设置断点并通过在 VS.NET 解决方案资源管理器中右键单击 *.tt 文件来调用 [调试 T4 模板] 来艰难地发现这一点。