2017-02-03 13 views
2

私のドメインエンティティはEFテーブルのタイプごとの継承を使用しています。EFでエンティティのタイプを取得するTPT継承

table per type

あなたが請求書を見ることができるように、親エンティティOrder.csに座っています。これで、私は請求書を処理するときに問題を引き起こしています。例えば

は請求書を作成するために、私は請求書コントローラに 注文IDに合格する必要があります。

public ActionResult Create(int orderId) 
{ 
    if (orderId == 0) return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 

    // determine whether the order is a SaleOrder or a PurchaseOrder 
    // then create the viewModel passing in the SaleOrder/PurchaseOrder details 
    return View(viewModel); 
} 

を私は順序が単にそのIdであるか、子を入力把握するにはどうすればよいです?

UPDATE

テオは、私は現在、SaleOrdersとPurchaseOrdersのを取得したか尋ねました。

public DbSet<PurchaseOrder> PurchaseOrders { get; set; } 
public DbSet<SaleOrder> SaleOrders { get; set; } 

が、私は、各周りにリポジトリを構築しているので、私はPurchaseOrderRepositorySaleOrderRepositoryを持っていると私は私のCRUDの方法を実行します。私は私のコンテキストでこれを持っています。

+1

のような順序を求めます。 SOとPOを同じテーブルまたは異なるテーブルに保管していますか?どのように実際にそれらを取得しますか?注文タイプに割り当てられたIDの範囲には違いがありますか?どんなIDがどのオーダータイプに割り当てられたかを把握している何らかの制御メカニズムを設定するのは嫌ですか? – Theo

+1

@テオ、彼はすでにこれがTPT戦略だと言っています –

+0

そうですね、それぞれに独自のテーブルがあり、それがTPTの意味です。しかし、私は有用かもしれないいくつかの他の情報を追加しました – Ciwan

答えて

1

は、2つのクラスが同じクラスから継承する場合は、別のDbSet

public DbSet<Order> Orders { get; set; } 

を作成し、あなたの行動にできることの任意の数に依存するであろうこの

public ActionResult Create(int orderId) 
    { 
     if (orderId == 0) return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     var order = db.Orders.Find(orderId); 
     if(order is SaleOrder){ 
     //do your stuff for SaleOrder 
     } 
     if(order is PurchaseOrder){ 
     //do your stuff for PurchaseOrder 
     }   
     return View(viewModel); 
    } 
+0

これは私の 'SaleOrderRepository'と' PurchaseOrderRepository'を統一する考えを与えました。それもできますか?または、たとえば、すべてのPurchaseOrdersを戻したい場合は、それらを別々にする必要がありますか – Ciwan

関連する問題