2009-06-01 9 views
1

私は2つのテーブルDealCostを持っています。コストはさまざまな種類があります。たとえば、計画済み、計画外です。すべての取引で、それぞれのタイプのコストのうちの1つだけを持つことができます。これは、IList of Costsを反論して、多対1の取引に対応するのは簡単です。しかし、私が望むのは、各コストのプロパティを指定したコストオブジェクトを作成することです。このようになり、データベースのように:Nhibernateマッピング:オブジェクト内のリストをカプセル化する

Deal:    Cost 
ID Name   ID DealID Type  Value 
---------   ------------------------------- 
1 Test   1 1  Planned  10 
        2 1  Unplanned 5 

それがどのようにこの

Deal.Costs.Planned = 10m; 
Deal.Costs.Unplanned = 5m; 

のようなアクセス可能であり、これをマッピングするについて行くための最良の方法ですか?私はそれをマッピングしなければならないのでしょうか?また、基本的なコレクションを照会するためにプロパティを手書きで書くべきですか?

難易度はコストのプロパティをマッピングしているため、同じテーブルの異なる行にマッピングされています。 1つの列を弁別子として使用する。

答えて

0

プロパティ手で 方法を記述します。これにより、ビジネスルールとして「あらゆる取引でそれぞれのタイプのコストのうちの1つしか持てません」を強制することができます。それはこのようなものになります:あなたはNHibernateのmapping.A式の式タグを使用して、クラスの式の性質を持つことができます

public class Deal 
{ 
    private IList<Cost> _costs = new List<Cost>(2); // map this collection 

    public Cost PlannedCost 
    { 
     get { return _costs.FirstOrDefault(c => c.Type == CostType.Planned); } 
     set 
     { 
      var plannedCost = _costs.FirstOrDefault(c => c.Type == CostType.Planned); 
      if (plannedCost != null) 
      { 
       _costs.Remove(plannedCost); 
      } 
      _costs.Add(value); 
     } 
    } 

    public Cost UnplannedCost { // similarly } 
} 
+0

これは私のdeal.costs.CostNameの表記を可能にするものです。それは私のためのマッピングの問題のある部分です。 –

+0

あなたは今のところあなたの表記を心配していますか? –

0

コストはリストのようにこれは本当に私には聞こえません。

私はDealのプロパティとしてコストをマッピングします。 Deal.Costs.Planned構文を保持したい場合は、コンポーネントマッピングを使用できます。私は個人のコレクションとしてコストをマッピングし、ディールに計画的および計画外のコストを公開します

public class Deal 
{ 
    public virtual Cost GetPlannedCost() 
    { 
     return _costs.FirstOrDefault(x => x.IsPlanned()); 
    } 

    public virtual Cost GetUnplannedCost() {} 
    { 
     return _costs.FirstOrDefault(x => x.IsUnplanned()); 
    } 

    public virtual Cost[] GetAllCosts() 
    { 
     return _costs.ToArray(); 
    } 

    private ISet<Cost> _costs = new HashedSet<Cost>(); 
} 
+0

これは意味があります。しかし、リストの各プロパティのコストテーブルから異なる行を選択してコンポーネントをマッピングするにはどうすればよいと思いますか。 –

+0

コストを取引のプロパティとしてマッピングする場合、取引テーブルに外部キーを追加する必要があります。私はもちろんあなたがdbのコントロールを持っていると仮定しています。 –

+0

DBには既にその構造があります。難しいのは、プロパティを同じテーブルの異なる行にマッピングすることです。質問はこれで明確になるように編集されました。 –

0

0

を単にマッピングクエリのサブクエリとして挿入されるSQL文です。 明らかに、数式プロパティは読み取り専用であり、更新することはできません。

あなたが各取り引きのために、これらの特性を計算したいので、(あなたが数式を使用したい場合)は、このようにあなたが持っているでしょうディールのプロパティとして追加する必要があります

​​

Hereの説明記事数式プロパティ。

関連する問題