【问题标题】:Controlling Foreign Key Name in EF Reverse POCO Generator在 EF 反向 POCO 生成器中控制外键名称
【发布时间】:2018-07-07 15:55:27
【问题描述】:

我正在使用 Simon Hughes 的反向 POCO 生成器来生成我的域实体。

我有一个ProcedureLogbook 表,外键返回到Procedure 表。没什么特别的。只是对 Pk - m:1 的直接引用。我也与Procedure 表有第二关系。第二个关系没有让我感到悲伤,并且按预期命名 Navigation 属性,即 ReportingProcedure(FK 称为 FK_ProcedureLogbookType_ReportingProcedure)。

对于其他关系(主要关系),POCO 生成器在 ProcedureLogbook 类中创建一个名为 Procedure_ProcedureId 的导航属性,而不仅仅是 Procedure。 FK 称为FK_ProcedureLogbookType_Procedure

代码如下所示:

/// <summary>
/// Parent Procedure pointed by [ProcedureLogbookType].([ProcedureId]) (FK_ProcedureLogbookType_Procedure)
/// </summary>
public virtual Procedure Procedure1 { get; set; } // FK_ProcedureLogbookType_Procedure

/// <summary>
/// Parent Procedure pointed by [ProcedureLogbookType].([ReportingProcedureId]) (FK_ProcedureLogbookType_ReportingProcedure)
/// </summary>
public virtual Procedure ReportingProcedure { get; set; } // FK_ProcedureLogbookType_ReportingProcedure  

我试图通过将以下代码放入 ForeignKeyNames 闭包中来强制它的手:

if (foreignKey.ConstraintName.Equals("FK_ProcedureLogbookType_Procedure"))
{
    if (foreignKey.FkTableName.Equals("ProcedureLogbookType"))
    {
        return "Procedure";
    }
}

这给了我一个名为Procedure1的导航属性。
知道问题是什么吗?我希望能够使用如下代码:

procedureLogbook.Procedure == etc

注意:我还尝试了以下代码,因为我注意到关系另一端的 NavigationProperty 也获得了后缀“1”:

if (foreignKey.ConstraintName == "FK_ProcedureLogbookType_Procedure")
{
    if(relationship == Relationship.OneToMany)
        return "ProcedureLogbookTypes";
    return "Procedure";
}  

还是没有结果。如何去掉“1”后缀?

除此之外,在我的程序实体中,它没有为导航属性之一(上面引用的ReportingProcedure)获得正确的复数形式。它正在创建以下内容:

public virtual ICollection<ProcedureLogbookType> ReportingProcedure { get; set; }

作为一个集合,它应该是复数。

(交叉发布在 Pluralsight 论坛上,课程代码优先实体框架与遗留数据库)

【问题讨论】:

  • 如果您使用最新版本的生成器,您还会遇到同样的问题吗?
  • @SimonHughes 让我试试。我用的是2.33。电流为 2.36。我将不得不再次自定义文件等。注意自我 - 找到跟踪自定义更改的方法。将在一天左右返回结果。谢谢。
  • @SimonHughes 对 2.36 的更新并不顺利。模板运行,但它在我的实体中创建重复的属性。所以该项目不再建设。这个问题的主题不是属性。只是实体中的其他外键。知道为什么它会创建具有相同类型和名称的属性吗?
  • 绝对不应该创建重复的属性。您能否通过电子邮件将相关表的 Sql DDL 发送给我,我会看一下。西蒙 [at] hicrest .net
  • @SimonHughes 谢谢西蒙。我会尽快扭转局面。这个项目可能是一个死亡行军,所以可能需要一两天。

标签: entity-framework poco


【解决方案1】:

在 EF.Reverse.POCO.Core.ttinclude 中,您可以更新尝试 5 的逻辑(v2.36.1 中的第 3622 行),因此它不会在循环的第一次迭代中添加后缀

// Attempt 5
        for (int n = 0; n < 99; ++n)
        {
            col = Settings.ForeignKeyName(tableNameHumanCase, foreignKey, fkName, relationship, 5);

            if (n > 0)
            {
                col += n;
            }

            if (ReverseNavigationUniquePropName.Contains(col))
                continue;

            if(addReverseNavigationUniquePropName)
            {
                ReverseNavigationUniquePropName.Add(col);
            }

            return col;
        }

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    相关资源
    最近更新 更多