我剛開始使用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=1
,parentcategoryid=1
)。
這讓我一個.Parent property
,不斷反覆引用同一個對象。 (所以.Parent.Parent.Parent.Parent.etc
是同一個對象)
NHibernate似乎很聰明,最終放棄,但它大大放慢了事情。
因此,理想地,映射應以這樣的方式定義的,如果只將parentcategoryid=categoryid
或者如果parentcategoryid=0
,所述.Parent
柱被忽略(設置爲null
)。
這可以通過Fluent映射來完成嗎?
這似乎工作。看起來我也可以在setter中處理0問題。我不確定它是否會將NHibernate與保存混淆。我必須測試一下。 – andreialecu 2011-01-28 21:30:02