我無法弄清楚如何配置我的mappins用流利:(功能NHibernate HasOne + ReferencesAny
這裏是我的情況: 我有一個元素對象,(理論上)應該有一個一對一與搜索對象關係。然而,所述搜索對象應具有一對多的關係與自身。 換句話說,Element對象可以具有至多1個搜索對象(也可以沒有),和一個搜索對象,還有其他的搜索對象的集合。
我開始用下面的映射。他們建立正確的DB模式,我預計可以節省罰款。檢索數據時出現的問題開始...
public class ElementMap : ClassMap<Element>
{
public ElementMap()
{
Schema("dbo");
Table("Element");
LazyLoad();
Id(x => x.Id)
.Column("Id")
.CustomType("Int32")
.Access.Property()
.CustomSqlType("int")
.Not.Nullable()
.UnsavedValue(0)
.GeneratedBy.Identity();
HasOne(x => x.Search)
.Cascade.All()
.Not.LazyLoad();
}
}
和
public class SearchMap : ClassMap<Search>
{
public SearchMap()
{
Schema("dbo");
Table("Search");
LazyLoad();
Id(x => x.Id)
.Column("Id")
.CustomType("Int32")
.Access.Property()
.CustomSqlType("int")
.Not.Nullable()
.UnsavedValue(0)
.GeneratedBy.Identity();
ReferencesAny(x => x.Parent)
.IdentityType<int>()
.MetaType<string>()
.EntityTypeColumn("ParentType")
.EntityIdentifierColumn("ParentId")
.AddMetaValue<Element>("E")
.AddMetaValue<Search>("S");
HasMany(x => x.Searches)
.Table("Search")
.KeyColumn("ParentId")
.Where("ParentType = 'S'")
.Cascade.All()
.LazyLoad();
}
}
所以正如所說,模型看起來正確,元素表包含ID 1列,搜索表中包含一個ID列,一ParentType的列設置爲「E」如果父元素是Element對象,並且如果父元素是Search對象,則設置爲「S」,最後是引用父元素ID的ParentId。
不知怎的,這似乎是罰款,是有道理的(至少對我來說:P)。
下面是在數據庫中的數據的一個樣本:
Element table
Id
-----------
1
2
Search table
Id ParentType ParentId
----------- ---------- -----------
1 E 1
2 S 1
3 E 2
4 S 3
5 S 3
所以我在這裏的第一個元素對象包含包含1個搜尋對象, 和第二個元素對象包含包含2個搜索對象的搜索對象搜索對象。
現在的問題是,當我檢索數據,第一個元素對象是正確的,但第二個一個不是。其搜索對象ID'd 2,在那裏真的應該是3(第二搜索對象whoses父的ID在數據庫中標記爲E)。
我的猜測是,我應該以某種方式爲Element對象映射添加一個.Where(「ParentType ='E'」),就像我爲搜索對象所做的那樣,但HasOne上沒有.Where()方法()方法(因爲它通常沒有意義)。所以我真的不知道如何指定它:(
我希望這是清楚的問題總是很難解釋:) 任何幫助將不勝感激,因爲這是一個非常重要的項目我:(
謝謝大家!
勒布:)
從我所瞭解的HasOne應該用於真正的一對一映射,這不是我所擁有的,但是,使用HasMany需要一個集合作爲參數...是否有其他選擇? – Seb 2012-08-10 07:28:19