2011-10-24 9 views
1

私はNH(ver.3.2)を学ぼうとしており、マッピングの選択肢のいくつかを理解することに問題があります。 Scott FindlaterがセクシーLoquacious NH hereのための完全に機能しているスケルトンを掲載しました。マッピングについての私の質問は彼のサンプルに基づいています。ここ は、ドメインモデルである(彼のサンプルのPI​​Cない部分が、わかりやすくするためにここに含まれています):このようなNHibernate 3.2マッピングの選択肢、関係およびPOV?

public class Category : Entity 
    { 
     public Category() 
     { 
      Products = new List<Product>(); 
      SubCategories = new List<Category>(); 
     } 

     public virtual string Name { get; set; } 
     public virtual string Description { get; set; } 
     public virtual Category Parent { get; set; } 
     public virtual IEnumerable<Category> SubCategories { get; set; } 
     public virtual IList<Product> Products { get; set; } 
    } 

と彼のマッピングクラス:

enter image description here

彼のカテゴリクラスには、次のようになります。

:質問のための今

class CategoryMap : ClassMapping<Category> 
    { 
     public CategoryMap() 
     { 
      // ************************************************** 
      // Mapping of Id here will take precedence over the 
      // global conventions configured in the ModelMapper. 
      // ************************************************** 
      //Id(x => x.Id, map => 
      //{ 
      // map.Column("Id"); 
      // map.Generator(Generators.GuidComb); 
      //}); 

      Property(x => x.Name, m => m.Length(450)); 
      Property(x => x.Description, m => m.Length(2000)); 

      Set(x => x.SubCategories, set => 
              { 
               set.Key(k => k.Column("ParentCategoryId")); 
               set.Inverse(true); 
              } , 
             ce => ce.OneToMany()); 

      ManyToOne(x => x.Parent, manyToOne => 
             { 
              manyToOne.Column("ParentCategoryId"); 
              manyToOne.Lazy(LazyRelation.NoLazy); 
              manyToOne.NotNullable(false); 
             }); 


      Set(x => x.Products, set => 
            { 
             set.Key(key => 
             { 
              key.Column("ProductId"); 
              key.ForeignKey("FK_Product_Category_ProductId"); 
             }); 
             set.Table("Product_Category"); 
            }, 
            ce => ce.ManyToMany(m => m.Column("CategoryId"))); 
     } 
    } 

、 210

1)なぜ彼はManyToOne関係としてParentプロパティをマッピング/モデル化することを選択しましたか?これは、カテゴリが複数の親カテゴリに属している可能性があることを示唆していませんか?そうであれば、これはモデル自体からはあまり明確ではありません。なぜなら、Parent(クラス定義にあるように)はCategory型のプロパティのように見えます。このソリューションのアプローチをいつ選択しましたか。それを単純なプロパティとしてマッピングしますか?

2)私はファイルをマップするとき、誰が(またはどのような)パースペクティブを見ているべきですか?これはあなたがマップしようとしているクラスの中から来たようです。だから、この場合、私がCategoryクラスをマップしようとしているとき、私は「矢印」を外に出すマッピングに関心があります。

3)マッピングファイルを作成する人は、クラスを見るだけで明確なもの以外の知識が必要です。 Productsプロパティがどのようにマップされているかを見てください(ManyToMany関係)。クラスそのものから、カテゴリーは多くのプロダクトに属するかもしれないが、カテゴリーはそれが多くのプロダクトに含まれているかも知れないことだけが分かります。その事実はProductクラスにとって明らかです。今私は、マッピングファイルを作成するときに、クラスの視点からモデルを見ていなければならないと私は思っていました。

4)一般的に言えば、.Inverse()、.Cascade()、.Lazy()をいつ使用しますか?

5)ModelMapperとConventionModelMapperを使用したマッピングの違いは何ですか?私は、後者の方法を使用する同じプロジェクトに含まれているファイルを研究していませんが、優先度以外のものがあるかどうかを知りたいと思っていました。

答えて

2
  1. スコットはカテゴリーとその親(別の)カテゴリー間のOrdinary Association(many-to-one)アソシエーションを確立することを決めました。多対1の関連付けにより、カスケードやフェッチ戦略など、プロパティマッピングにはない機能にアクセスできます。たとえば、親とそのすべての子を削除するとします。カスケードはあなたを助けることができます。

  2. 関連がある場合は、関連の両側について考える必要があります。たとえば、'A''B'の間に双方向の1対多の関連があるとしたら、関係を管理する側に注意する必要があります。 'A'のマッピングを書くときには、'A'がどのように関係しているのかという点と、'B'をマッピングするときには逆になります。

  3. あなたの意見は私には少し不明です。しかし、あなたが説明しているように見えるのは、基本的なOOPオブジェクトの関係です。クラスは、順番に「B」「B」オブジェクトとの関係は、「C」に関連してもよいIS 'をプロパティを有していてもよいです。 'A'を見てみると、'C'に過渡的に関連しているとは言えません。それには何も問題はありません。

  4. Read the documentation

    4.1逆:双方向関係のどちら側が関係を管理するかを定義します。

    4.2カスケード:特定の操作を子アソシエーションにカスケードすることを許可します。 (削除など)

    4.3遅延:コレクションを読み込む方法を定義します。

  5. ConventionalModelMapperは、ModelMapperの上に構築され、便利なマッピング方法とデフォルトのマッピング規則を提供し、マッピングをより簡単に行うことができます。

+0

私は、アソシエーションがbi/uni方向性のときに問題を検出している(ドメインモデルを見ると)と思います。製品とカテゴリーの関連性についてどのように考えるべきですか?モデルを見ると、1対多の関連付けが2つあります。商品には多くのカテゴリがあり、カテゴリには多くの商品があります。それは間違っていますか?それとも、私はそれを多対多関連として考えるべきですか? – user981375

1
  • 1.のためにそれはそれは多くのカテゴリーが同じ親カテゴリに表現することができ、各カテゴリーは、サブカテゴリーのリストを持つことができることを意味し、各カテゴリは、多くの親カテゴリを持っていることを意味するものではありません。それが1対1で表現されていれば、各カテゴリには1つのカテゴリしかないことを意味し、あなたはそれをするつもりはないと思います。あなたは、子エンティティが関係の所有者または子実体の意志ではない1対多の関係でそれを使用する場合がありますので、4.Inverse()については

  • は、協会の所有者を指定するために使用されます関係について責任を負うことはなく、関係についての知識がないので、trueに設定されている場合、NHibernateは結合によって定義されたプロパティを挿入または更新しようとしません。

  • Cascade()は、親エンティティから関連エンティティにカスケードされる操作を指定します。

  • lazy他のエンティティによって参照されるエンティティを遅延読み込みするため。

  • 2.と3.私はあなたのポイントを理解することはできませんが、私は思いますが、私は思うエンティティをマッピングしているなら、あなたはマッピングしているクラスの視点から見るべきですあなたがマッピングしているときの関係の反対側のものは、それが関係の両側を考慮する必要がある同じ時間に置かれた視点から見ます。

関連する問題