我刚刚开始使用NHibernate,而我正在尝试加入一个使用0
而不是NULL
值的遗留表来表示不存在的内容。
数据库中还有一行ID为0
的行,它只是一个占位符。
我想避免检索此占位符,而是希望我的属性显示为null
。
我尝试使用IUserType
来处理0
到null
的值并将其映射回来,但我不认为多对一(.References()
)映射与自定义类型一起使用。
这是班级:
public class Category
{
public virtual int Id { get; set; }
public virtual string CategoryName { get; set; }
public virtual Category Parent { get; set; }
public virtual IList<Category> Children { get; set; }
public virtual Category RealCategory { get; set; }
public virtual bool IsHomeParent { get; set; }
}
这是映射:
public class CategoryMapping:ClassMap<Category>
{
public CategoryMapping()
{
Id(x => x.Id);
Map(x => x.CategoryName);
Join("categorymappings",
m =>
{
m.KeyColumn("categoryid");
m.Map(z => z.IsHomeParent);
// need ids of 0 to come up as null for .Parent
m.References(z => z.Parent).Column("parentcategoryid");
m.References(z => z.RealCategory).Column("realcategoryid").Not.LazyLoad();
m.Optional();
});
HasManyToMany(p => p.Children)
.Table("categorymappings")
.ParentKeyColumn("parentcategoryid")
.ChildKeyColumn("categoryid")
.Where("ishomeparent=0")
.Fetch.Join()
.Not.LazyLoad();
Table("categories");
}
}
所以,再一次。我正在尝试.Parent
null
为0
的ids。
在相关的说明中,遗留数据库中的数据也存在无限递归问题,我需要避免这种问题。
当类别位于最顶层时,categoryid
等于映射表中的parentcategoryid
(例如categoryid=1
,parentcategoryid=1
)。
这让我得到.Parent property
一遍又一遍地引用相同的对象。 (所以.Parent.Parent.Parent.Parent.etc
是同一个对象)
NHibernate看起来很聪明,最终可能放弃,但它的速度相当大。
因此,理想情况下,应该以这样的方式定义映射:如果parentcategoryid=categoryid
或parentcategoryid=0
,.Parent
列将被忽略(设置为null
)。
可以使用Fluent映射吗?
答案 0 :(得分:2)
如果可能,请使用视图过滤出ID为0的行。
对于第二个问题,将父对象映射为私有字段并将其公开,如下例所示。如果对象及其父对象相同,则返回null父对象。
public virtual Category ParentCategory
{
get { return CategoryId == _parentCategory.CategoryId ? null : _parentCategory; }
set { _parentCategory = value ?? this; }
}