3

複数の型の継承を処理する方法を理解しようとしています。本番環境にライブ データがある既存の Code First / EF / MVC プロジェクトがあります。システムは、多くの機能を実行できる「ドキュメント」と呼ばれるタイプを使用し、DocumentID にリンクできる関連テーブルが多数あります。

現在、製品、数量、および単価を参照する「OrderLines」のコレクションなど、いくつかのより具体的なプロパティを実装する、より差別化された種類のドキュメントである発注書があります。発注書に固有のフィールドが他にもいくつかあります。「OrderLines」を持つベース ドキュメント タイプと区別されることに加えて、発注書はサプライ サイド ドキュメントであり、そのため、サード パーティは「ベンダー」です。将来的には、サード パーティとしてのベンダーも含む他のサプライ サイド ドキュメントが存在する可能性があります。

これで、デマンド サイドとなる新しいドキュメント タイプを実装する準備が整いました。これは、顧客と呼ばれるサード パーティが存在することを意味します。また、OrderLines のコレクションもあります。

私のシステムは現在 TPH として設定されているため、テーブルは「ドキュメント」と呼ばれ、内部のドキュメントが発注書であることを示す識別子列があります。

新しい型を追加し、継承を使用して OrderLines コレクションと CustomerID / Customer リンクを実装するにはどうすればよいですか? c# は多重継承を行うことができないようです。そのため、次のことは問題外です。

ドキュメント -> OrderLinesDocument -> PurchaseOrder

ドキュメント -> OrderLinesDocument -> 請求書

ドキュメント -> VendorDocument -> PurchaseOrder

ドキュメント -> CustomerDocument -> 請求書

すべてのドキュメントではなく、多くのドキュメントに共通する可能性があるフィールドを、中産階級はどこに実装するでしょうか?

インターフェイスを使用してこれを達成する方法はありますか?それでもEFにテーブルを適切に把握させますか?

4

1 に答える 1

0

継承は多くの点でトリッキーになる可能性があるため、私のアドバイスは「簡単に」実行することです。

しかし、ここで典型的な OO 設計を行うだけで、使用可能なテーブル、構造が生成されます。たぶん、このようなものがあなたのために働くかもしれません...

public class Document
{
    public long ID { get; set; }
    public string Name { get; set; }
}

public class OrderLinesDocument : Document
{
    public ICollection<OrderLine> OrderLines { get; set; }
}

public interface IVendorDocument
{
    ICollection<Vendor> Vendors { get; set; }
}
public class VendorDocument : Document, IVendorDocument
{
    public ICollection<Vendor> Vendors { get; set; }
}

public interface ICustomerDocument
{
    ICollection<Customer> Customers { get; set; }
}
public class CustomerDocument : Document
{
    public ICollection<Customer> Customers { get; set; }
}

public class PurchaseOrder : OrderLinesDocument, IVendorDocument
{
    public ICollection<Vendor> Vendors { get; set; }
}

public class Invoice : Document, ICustomerDocument
{
    public ICollection<Customer> Customers { get; set; }
}

最も単純なソリューション IMO は TPH を使用しています (ほとんど「そのまま」)。

しかし、私が言ったように、注意してください-そして、あなたが考えているものではうまくいかないかもしれません-つまり、実験する必要があります.Dbレコードが最適に見えることを確認してください.

ところで。知らなかった場合は、このように使用できます。投稿するのを忘れていました...

var query1 = db.Documents.OfType<PurchaseOrder>().ToList();
var query2 = db.Documents.OfType<Invoice>().ToList();

var query3 = db.Documents.OfType<CustomerDocument>().ToList();
var query4 = db.Documents.OfType<VendorDocument>().ToList();
var query5 = db.Documents.OfType<OrderLinesDocument>().ToList();

var query6 = db.Documents.OfType<Document>().ToList();

(実際にどのように機能するかを試してみてください)

于 2013-04-08T23:56:03.220 に答える