【发布时间】:2026-01-24 03:00:02
【问题描述】:
我正在尝试学习 NH(版本 3.2),但在理解某些映射选择时遇到了问题。 Scott Findlater 为性感 Loquacious NH here 发布了他的完整工作骨架,我关于映射的问题将基于他的示例。 这是域模型(图片不是他的示例的一部分,但为了清楚起见包括在此处):
他的类别类如下所示:
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 关系?这是否表明 Category 可以属于多个父类别,即任何给定类别(我认为除了根类别之外)都可以分布在许多其他父类别中?如果是这样,那么从模型本身来看,这并不是很清楚,因为对我来说,Parent(正如我在类定义中看到的那样)看起来像 Category 类型的属性,我会这样映射它。你什么时候会在这个解决方案中选择方法?将其映射为一个简单的属性?
2) 当我映射文件时,我应该从谁(或哪个)角度查看?在我看来,这是来自您要映射的课程的内部。所以,在这种情况下,当我尝试映射 Category 类时,我只关心映射出去的“箭头”,对吧?
3) 创建映射文件的人必须具有仅通过查看类就清楚的知识之外的知识。查看 Products 属性是如何映射的(ManyToMany 关系)。从类本身来看,仅清楚 Category 可能属于许多 Products,但 Category 不知道它可能包含在许多 Products 中。对于 Product 类,这一事实是显而易见的。现在我已经说过,在我看来,当我创建映射文件时,我应该从一个类的角度来看,然后是一个模型。
4) 一般来说:什么时候使用.Inverse()、.Cascade() 和.Lazy()?
5) 使用 ModelMapper 与 ConventionModelMapper 进行映射有什么区别?我没有研究过使用后一种方法的同一个项目中包含的文件,但我想知道除了偏好之外,使用一个比另一个更有优势。
【问题讨论】:
标签: nhibernate