【问题标题】:Entity Framework TT template -> Navigation Property name based on foreign key ID实体框架 TT 模板 -> 基于外键 ID 的导航属性名称
【发布时间】:2025-12-07 13:10:02
【问题描述】:

我有下表:

CREATE TABLE Phone(
PhoneId INT IDENTITY (1, 1) NOT NULL,
CONSTRAINT PK_Phone PRIMARY KEY CLUSTERED (PhoneId ASC))

CREATE TABLE Person(
PersonId INT IDENTITY (1, 1) NOT NULL,
MobilePhoneId INT NOT NULL,
PhoneId INT NOT NULL,
...

CONSTRAINT PK_Person PRIMARY KEY CLUSTERED (PersonId ASC),
CONSTRAINT FK_Projects_Phone FOREIGN KEY (PhoneId)
    REFERENCES Phone(PhoneId),
CONSTRAINT FK_Projects_MobileId FOREIGN KEY (MobilePhoneId)
    REFERENCES Phone(PhoneId),
...

我正在使用 EF,我想根据外键生成导航属性,删除 Id 部分,所以我想拥有导航属性 Phone 和 MobilePhone。我尝试调试,但我没有找到外键存储在哪里。请帮助 TT 模板:我应该在哪里修改和修改什么。

【问题讨论】:

    标签: entity-framework t4 edmx


    【解决方案1】:

    您可以通过在设计器中编辑 edmx 或编辑 T4 模板来完成。当您想编辑 T4 模板(您的模型 .tt 文件)时,请尝试修改:

    public string NavigationProperty(NavigationProperty navProp)
    {
        var endType = _typeMapper.GetTypeName(navProp.ToEndMember.GetEntityType());
        return string.Format(
            CultureInfo.InvariantCulture,
            "{0} {1} {2} {{ {3}get; {4}set; }}",
            AccessibilityAndVirtual(Accessibility.ForNavigationProperty(navProp)),
            navProp.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType,
            _code.Escape(navProp),
            _code.SpaceAfter(Accessibility.ForGetter(navProp)),
            _code.SpaceAfter(Accessibility.ForSetter(navProp)));
    }
    

    这样:

    public string NavigationProperty(NavigationProperty navProp)
    {
        var navigationPropertyName = _code.Escape(navProp);
        var match = System.Text.RegularExpressions.Regex.Match(navigationPropertyName, "^(?<a>.+)Id$");
        if(match.Success)
            navigationPropertyName = match.Groups[1].Value;
    
        var endType = _typeMapper.GetTypeName(navProp.ToEndMember.GetEntityType());
        return string.Format(
            CultureInfo.InvariantCulture,
            "{0} {1} {2} {{ {3}get; {4}set; }}",
            AccessibilityAndVirtual(Accessibility.ForNavigationProperty(navProp)),
            navProp.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType,
            navigationPropertyName,
            _code.SpaceAfter(Accessibility.ForGetter(navProp)),
            _code.SpaceAfter(Accessibility.ForSetter(navProp)));
    }
    

    【讨论】: