【问题标题】:Entity Framework table-per-type: 1:0...* FK relationship with a derived class - is FK of base class or derived class?Entity Framework table-per-type: 1:0...* 与派生类的 FK 关系 - 是基类还是派生类的 FK?
【发布时间】:2013-01-26 13:57:45
【问题描述】:

我有一个类Tenant,它是抽象类型UserProfile。我正在使用 table-per-type 继承方法。一个租户可以代表一组租户。 TenantGroupMember 就是这样一个组之一。所以,1 个Tenant 可以有零个或多个TenantGroupMembers。

如何使用 table-per-type 方法表示此关联?我接近它的方式如下:

[Table("TenantGroupMember")]
public class TenantGroupMember
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int TenantGroupMemberId { get; set; }

    // 1:many with Tenant - base UserProfile
    public int UserProfileId { get; set; }
}

[Table("Tenant")]
public class Tenant : UserProfile
{
    public string TenantAge { get; set; }
    public string PersonalDescription { get; set; }

    // 1:many with TenantGroupMember
    public virtual ICollection<TenantGroupMember> TenantGroupMembers { get; set; }
}

我在TenantGroupMember 中从UserProfile 制作FK 是否正确?因为ICollection TenantGroupMembersTenant 中,EF 会知道TenantGroupMember 只能与Tenant 相关联,而不能与UserProfile 的任何其他派生类相关联?

【问题讨论】:

    标签: c# database entity-framework ef-code-first table-per-type


    【解决方案1】:

    是的,你是对的。但是,您必须将TenantGroupMember.UserProfileId 属性显式声明为关系的外键。 EF 不会按照惯例检测到这一点,并将其视为普通标量属性并在数据库中创建另一个 FK 列。您可以使用数据注释来做到这一点...

    [ForeignKey("UserProfileId")]
    public virtual ICollection<TenantGroupMember> TenantGroupMembers { get; set; }
    

    ...或使用 Fluent API:

    modelBuilder.Entity<Tenant>()
        .HasMany(t => t.TenantGroupMembers)
        .WithRequired()
        .HasForeignKey(tgm => tgm.UserProfileId);
    

    关系将数据库中的Tenant 表作为主体/主键表,而不是UserProfile 表。

    【讨论】:

    • 当我尝试添加迁移时,我从包管理器控制台收到此错误“外键组件 'UserId' 不是类型 'Tenant' 上的声明属性。验证它不是明确地从模型中排除,并且它是一个有效的原始属性。”租户没有明确拥有 UserId,但它从 UserProfile 继承它。我正在创建与 Fluent API 的关联,有什么想法吗?
    • 嗨,很抱歉唤醒了一个旧问题,但我宁愿在发布新问题之前检查一下。我正在一个实施 TPT 的项目中工作,我们面临的问题与您在问题中提到的相同。 Slaurna 的回答解决了你的问题还是你需要做更多的事情来解决它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2013-02-06
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    相关资源
    最近更新 更多