0

OOPを考慮すると不可能ですが、EFと継承の方法がDBレベルで機能することを考慮すると、EFが同じオブジェクトから同時に子クラスオブジェクトを継承することを許可するかどうか疑問に思っています。つまり....親テーブルとして person という名前のテーブルがあり、そこから継承する user という名前のテーブルと enployee という名前の別のテーブルがあるとします。継承マッピングは子テーブルと親テーブルで同じ主キーを追跡することによって EF で機能するため、person クラスを保持し、employee クラスまたは user クラスのいずれかにキャストできる必要があります。EF で生成されたコードにいくつかの変更を加える必要があると思います。

4

1 に答える 1

1

ポリモーフィズムが必須の場合は、タイプごとのテーブル (TPT) または階層ごとのテーブル (TPH) 継承を使用する必要があります。多数のテーブルを持つドメイン モデルには TPH を使用し、テーブルが少ない場合は TPT を使用します。これは、ドメイン モデルが大きくなるほどクエリが乱雑になる可能性があるためです。

TPT は関係一部であることを表します。ユーザーは個人であり、ユーザーは従業員です。質問で言ったことを続けると、次のように TPT を使用できます。

public abstract class Person
{
    public int PersonId     { get; set; }   // EF will set this as PK
    public string FirstName { get; set; }
    public string LastName  { get; set; }
}

[Table("User")]
public class User : Person
{
    public string SomeUserProperty { get; set; }
}

[Table("Employee")]
public class Employee : Person
{
    public string SomeEmployeeProperty { get; set; }
}

次に、クラスで、タイプ基本クラスのクラスContextのみを作成します。DbSet

public class MyDbContext: DbContext
{
    public DbSet<Person> Person { get; set; }
}

次に、ユーザーまたは従業員のインスタンスを作成するアプリケーションの一部で:

using (var db = new MyDbContext())
{
    var user = db.Person.Create<User>();
    user.SomeUserProperty = "I'm a user";

    var emp = db.Person.Create<Employee>();
    emp.SomeEmployeeProperty = "I'm an employee";

    db.Person.Add(user);
    db.Person.Add(emp);
    db.SaveChanges();
}
于 2013-03-31T13:00:05.953 に答える