实体框架每个类型的表:1:0 ... *与派生类的FK关系 - 是基类或派生类的FK?

时间:2013-01-26 13:57:46

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

我有一个类Tenant,它是抽象类型UserProfile。我正在使用table-per-type继承方法。租户可以代表一组租户。 TenantGroupMember是这样一个群体中的一个。因此,1 Tenant可以有0个或多个TenantGroupMember s。

这种关联如何使用每类表格方法表示?我接近它的方式如下:

[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 TenantGroupMembers位于Tenant,因此EF会知道TenantGroupMember只能与Tenant相关联,而且UserProfile不会与任何其他派生类相关联}?

1 个答案:

答案 0 :(得分: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表。

相关问题