0

一般的な情報 (名前、生年月日など) を持つ Person エンティティと、Person から継承する 2 つの追加エンティティ (Customer、Worker) を持つモデルがあるとします。ご覧のとおり、モデル内でワーカーの役割を果たすこともできる顧客を持つオプションがあります。これをEFで設計する方法があります(TPH、TPT、およびTPCについて何かを見ました)が、PersonテーブルにWorkerとCustomerの値を「同時に」含めることを許可しないdiscriminatorの使用があることがわかりました。

継承の一般的な OOP の概念に間違いがあるかどうかはわかりません:S.

ご協力いただきありがとうございます。

4

1 に答える 1

0

.net で複数の継承を行うことはできません。サポートされていません (エンティティ フレームワークにも同じことが当てはまります)。複数のインターフェースを実装できますが、これは少し異なる概念です。つまり、'Worker' は顧客などのオブジェクトによって実装されるインターフェースである可能性があります。

エンティティ フレームワークでは、ディスクリミネータは Table-per-hierarchy を使用する場合にのみ実装されると思います。これは、両方の子エンティティが同じテーブルに格納されている場所であり、ディスクリミネーターはどちらがどちらであるかを識別します。

Table-per-type は基本的に、エンティティ (個人、顧客、従業員) が異なるテーブルに格納される場所ですが、コード内で単一のエンティティとしてアクセスできます (つまり、個人から継承された顧客)。

インターフェイス (おそらく IWorker) を作成し、Customer から継承して IWorker を実装するクラス (おそらく WorkerCustomer??) を作成する必要があるかもしれません。

編集: 15/02/2013 19:00

わかりましたので、単一のテーブルでデータを表現するという点で、以下はあなたが探しているものかもしれません:

public class MyDbContext : DbContext
{
    public MyDbContext() : base("TestDB")
    {

    }

    public DbSet<Person> People { get; set; }
    public DbSet<Customer> Customers { get; set; }
    public DbSet<Worker> Workers { get; set; }
    public DbSet<WorkerCustomer> WorkerCustomers { get; set; }
}

public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Customer : Person
{
    public string CustomerNumber { get; set; } 
}

public interface IWorker
{
    string WorkerNumber { get; set; }
}

public class Worker : Person, IWorker
{
    public string WorkerNumber { get; set; }
}

public class WorkerCustomer : Customer
{
    public string WorkerNumber { get; set; }
}
于 2013-02-15T08:10:27.677 に答える