2012-08-09 92 views
1

我無法弄清楚如何配置我的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()方法()方法(因爲它通常沒有意義)。所以我真的不知道如何指定它:(

我希望這是清楚的問題總是很難解釋:) 任何幫助將不勝感激,因爲這是一個非常重要的項目我:(

謝謝大家!

勒布:)

+0

從我所瞭解的HasOne應該用於真正的一對一映射,這不是我所擁有的,但是,使用HasMany需要一個集合作爲參數...是否有其他選擇? – Seb 2012-08-10 07:28:19

回答

1

HasOne不考慮ReferenceAny的任何部分,因此它不能在這裏使用的。我所看到的唯一選項是將私人搜索地圖與相應的地圖ParentType = 'E'進行映射,並將其轉換爲屬性Search中的參考。

+0

是的Firo,這是我所做的,因爲我還沒有找到任何其他的工作... 無論如何感謝您的答案! :) – Seb 2012-08-16 05:50:28