我正在努力学习NH(版本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")));
}
}
现在,对于问题:
1)为什么他选择将Parent属性映射/模型化为ManyToOne关系?这是否表明类别可以属于多个父类别,即任何给定的类别(除了我认为的根类别)都可以分散到许多其他父类别中?如果是这样的话,这个模型本身并不是很清楚,因为对于我来说,父类(就像我在类定义中看到的那样)看起来像一个类型属性,我会像这样映射它。你什么时候在这个解决方案v.s.中选择了方法?将它映射为一个简单的属性?
2)当我映射文件时,谁应该从哪个角度看(或哪个角度)?在我看来,这是来自你想要映射的课程的内部。因此,在这种情况下,当我尝试映射Category类时,我只关心映射“箭头”出去,对吧?
3)创建映射文件的人必须具有除了通过查看类才能清楚的知识之外的知识。看看产品属性如何映射(ManyToMany关系)。从类本身来看,只有类别可以属于许多产品,但类别不知道它可能包含在许多产品中。这个事实对于产品类是显而易见的。现在我已经说过,在我看来,当我创建映射文件时,我应该从类和视图的角度来看待模型。 4)一般来说:你什么时候使用.Inverse(),.Cascade()和.Lazy()?
5)使用ModelMapper与ConventionModelMapper进行映射的区别是什么?我没有研究过使用后一种方法的同一个项目中包含的文件,但我想知道除了偏好之外是否存在使用另一种方法的优点。
我想那时我有一个问题检测(当看一个领域模型)当关联是双向/单向的。我应该如何考虑产品和类别之间的关联?通过查看模型,我看到了两个一对多关联 - 产品有很多类别和类别都有很多产品。那是不正确的?或者我应该将其视为一个多对多的关联? – user981375