我是 NHibernate 的新手,我无法在此类中映射以下关系。
public class Category : IAuditable
{
public virtual int Id { get; set; }
public virtual string Name{ get; set; }
public virtual Category ParentCategory { get; set; }
public virtual IList<Category> SubCategories { get; set; }
public Category()
{
this.Name = string.Empty;
this.SubCategories = new List<Category>();
}
}
类映射(虽然,这些实际上是猜测)
public class CategoryMap : ClassMap<Category>
{
public CategoryMap()
{
Id(x => x.Id);
Map(x => x.Name);
References(x => x.ParentCategory)
.Nullable()
.Not.LazyLoad();
HasMany(x => x.SubCategories)
.Cascade.All();
}
}
每个类别可能有一个父类别,一些类别有许多子类别,等等 我可以正确保存类别(正确的子类别和父类别 fk 存在于数据库中)但是在加载时,它返回自身作为父类别。
我正在使用 Fluent 进行类映射,但如果有人可以为我指出正确的方向,只使用普通的 NHibernate,那也可以。
最佳答案
按照惯例,Fluent NHibernate 会将“Category_Id”视为外键列。它不会找出您的“ParentCategoryId”列。除非您将自引用列重命名为“Category_Id”,否则您必须明确父子关系的列名。
对于没有父级的类别(绝对父级类别),其引用列为 null,根据 NHibernate 的处理方式返回自身作为父级或 null 是合理的,因为您选择了预先加载。
public class CategoryMap : ClassMap<Category>
{
public CategoryMap()
{
Id(x => x.Id);
Map(x => x.Name);
References(x => x.ParentCategory)
.Column("ParentCategoryId") // Many-To-One : parent
.Nullable()
.Not.LazyLoad();
HasMany(x => x.SubCategories)
.Cascade.All().Inverse().KeyColumn("ParentCategoryId"); //One-To-Many : chidren
}
}
关于c# - 同类的 Fluent/NHibernate Collections,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2457739/