2011-01-28 14 views
0

我剛開始使用NHibernate,我試圖加入一個遺留表,它使用0而不是NULL的值來表示不存在的東西。在NHibernate中處理遺留表中的尷尬值

在數據庫中還有一行id爲0,它只是一個佔位符。

我想避免檢索此佔位符,而是我希望我的財產來作爲null

我試圖使一個IUserType處理的0值映射到null和背部,但I'don't想多到一(.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"); 
    } 
} 

所以,再次。對於0的ID,我試圖將.Parent設置爲null

在相關說明中,我還需要避免遺留數據庫中的數據存在無限遞歸問題。

如果類別是在最頂層,categoryid是在映射表中等於parentcategoryid(例如categoryid=1parentcategoryid=1)。

這讓我一個.Parent property,不斷反覆引用同一個對象。 (所以.Parent.Parent.Parent.Parent.etc是同一個對象)

NHibernate似乎很聰明,最終放棄,但它大大放慢了事情。

因此,理想地,映射應以這樣的方式定義的,如果只將parentcategoryid=categoryid或者如果parentcategoryid=0,所述.Parent柱被忽略(設置爲null)。

這可以通過Fluent映射來完成嗎?

回答

2

如果可能,使用一個考慮到與0

的ID濾除行對於第二個問題,父對象映射爲私有字段並將其公開如下面的例子。如果對象及其父對象相同,則返回空父對象。

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

這似乎工作。看起來我也可以在setter中處理0問題。我不確定它是否會將NHibernate與保存混淆。我必須測試一下。 – andreialecu 2011-01-28 21:30:02