1

我有一个抽象类UserProfile,它有一个子类Tenant,所以关系是 1:1 - 一个“用户”是一个“租户”。

这是在 1:1 的基础上实现 table-per-type 继承的正确方法吗?

[Table("UserProfile")]
public abstract class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    // ...
}

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

    // Navigation property on dependant end
    public virtual UserProfile UserProfile { get; set; }
}
  • 我将导航属性放在关系的依赖端是否正确?或者它的结局是否重要?

  • 我还需要放置一个类型为Tenantin 的导航属性UserProfile吗?

  • 最后,我读到值得让模型中的每个属性virtual来帮助 EF 进行更改跟踪 - 这是必要的吗?

4

1 回答 1

1

在每个类型的表方案中,您不需要导航属性。Tenant 不包含 UserProfile,Tenant 是一个 UserProfile。

EF 应该能够从 Tenant 表中获取 Tenant 字段的值,以及从 UserProfile 表中获取从 UserProfile 继承的字段。看起来很神奇,但它有效,至少对我来说:)

至于 DbSet,如果需要直接使用Tenant集合,可以添加TenantsDbSet。这将使您能够:

myContext.Tenants.Where(t => ... t.PersonalDescription ... t.UserId ...)

这相当于较长且不易发现的

myContext.UserProfiles.OfType<Tenant>.Where(t => ....)

我个人的偏好是根本不使用已声明的 DbSet,而是Set<T>()直接在包装存储库中使用该方法,该方法公开诸如等方法,但这是个人喜好问题GetByKeyUpdate

于 2013-01-25T14:03:52.873 回答