私はNH(ver.3.2)を学ぼうとしており、マッピングの選択肢のいくつかを理解することに問題があります。 Scott FindlaterがセクシーLoquacious NH hereのための完全に機能しているスケルトンを掲載しました。マッピングについての私の質問は彼のサンプルに基づいています。ここ は、ドメインモデルである(彼のサンプルのPICない部分が、わかりやすくするためにここに含まれています):このような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; }
}
と彼のマッピングクラス:
彼のカテゴリクラスには、次のようになります。
:質問のための今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を使用したマッピングの違いは何ですか?私は、後者の方法を使用する同じプロジェクトに含まれているファイルを研究していませんが、優先度以外のものがあるかどうかを知りたいと思っていました。
私は、アソシエーションがbi/uni方向性のときに問題を検出している(ドメインモデルを見ると)と思います。製品とカテゴリーの関連性についてどのように考えるべきですか?モデルを見ると、1対多の関連付けが2つあります。商品には多くのカテゴリがあり、カテゴリには多くの商品があります。それは間違っていますか?それとも、私はそれを多対多関連として考えるべきですか? – user981375