1

抽象クラスUserProfileがあり、サブクラスTenantがあるため、関係は 1:1 です。つまり、1 つの「ユーザー」が 1 つの「テナント」です。

これは、型ごとのテーブルの継承を 1:1 ベースで実装する正しい方法ですか?

[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; }
}
  • 関係の依存側にナビゲーション プロパティを配置するのは正しいですか? それとも、それがどのような終わりを迎えるかが重要ですか?

  • Tenantタイプの ナビゲーション プロパティも配置する必要がありUserProfileますか?

  • virtual最後に、モデル内のすべてのプロパティを作成して、 EF の変更追跡を支援する価値があることを読みました。これは必要ですか?

4

1 に答える 1

1

型ごとのテーブルのシナリオでは、ナビゲーション プロパティは必要ありません。Tenant には UserProfile が含まれていません。Tenant は UserProfile です。

EF は、Tenant テーブルから Tenant フィールドの値を取得し、UserProfile テーブルから UserProfile から継承されたフィールドを取得できる必要があります。魔法のように見えますが、少なくとも私にとっては機能します:)

DbSet に関しては、コレクションを直接使用する必要がある場合はTenant、DbSet を追加できますTenants。これにより、次のことが可能になります。

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

これは、より長くて発見しにくいものと同等です

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

私の個人的な好みは、宣言された DbSet をまったく使用せず、メソッドをなどのSet<T>()メソッドを公開するラッピング リポジトリで直接使用することですが、それは好みの問題です。GetByKeyUpdate

于 2013-01-25T14:03:52.873 に答える