【问题标题】:Reverse POCO Generator: How to Rename a Reverse Foreign Key?反向 POCO 生成器:如何重命名反向外键?
【发布时间】: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”。

标签: c# entity-framework foreign-keys code-generation poco


【解决方案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],我发现了这一点。

    【讨论】:

      猜你喜欢
      • 2018-07-07
      • 2019-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      相关资源
      最近更新 更多