使用NHibernate解决遗留表中的尴尬值

时间:2011-01-28 12:35:07

标签: c# nhibernate fluent-nhibernate

我刚刚开始使用NHibernate,而我正在尝试加入一个使用0而不是NULL值的遗留表来表示不存在的内容。

数据库中还有一行ID为0的行,它只是一个占位符。

我想避免检索此占位符,而是希望我的属性显示为null

我尝试使用IUserType来处理0null的值并将其映射回来,但我不认为多对一(.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 null0的ids。

在相关的说明中,遗留数据库中的数据也存在无限递归问题,我需要避免这种问题。

当类别位于最顶层时,categoryid等于映射表中的parentcategoryid(例如categoryid=1parentcategoryid=1)。

这让我得到.Parent property一遍又一遍地引用相同的对象。 (所以.Parent.Parent.Parent.Parent.etc是同一个对象)

NHibernate看起来很聪明,最终可能放弃,但它的速度相当大。

因此,理想情况下,应该以这样的方式定义映射:如果parentcategoryid=categoryidparentcategoryid=0.Parent列将被忽略(设置为null)。

可以使用Fluent映射吗?

1 个答案:

答案 0 :(得分:2)

如果可能,请使用视图过滤出ID为0的行。

对于第二个问题,将父对象映射为私有字段并将其公开,如下例所示。如果对象及其父对象相同,则返回null父对象。

public virtual Category ParentCategory
{
    get { return CategoryId == _parentCategory.CategoryId ? null : _parentCategory; }
    set { _parentCategory = value ?? this; }
}