1

我有一个Tenant抽象类型的类UserProfile。我正在使用 table-per-type 继承方法。一个租户可以代表一组租户。ATenantGroupMember是这样一个组之一。因此,1Tenant可以有零个或多个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; }
}

我将 FK 放入TenantGroupMemberfrom是否正确UserProfile?因为ICollection TenantGroupMembers是 in Tenant,EF 会知道 aTenantGroupMember只能与 a 相关联Tenant,而不能与 的任何其他派生类相关联UserProfile吗?

4

1 回答 1

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表。

于 2013-01-27T22:04:47.460 回答