反向 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 类中的属性