2011-07-21 106 views
1

我有一個具有以下字段的表稱爲AdministratorPrivilages:NHibernate的ReferencesAny拉回了錯誤的類型

  • ID
  • 列表項
  • 成員Id
  • 價值
  • MemberType

現在,成員可以是兩種類型(Enterprise a nd Express)。企業成員居住在企業表中。特快成員住在快車隊表中。我試圖像這樣做我的流利映射。

public class AdministratorPrivilegesMapping : ClassMap<AdministratorPrivileges> 
    { 
     public AdministratorPrivilegesMapping() 
     { 
      Id(x=>x.Id); 
      Map(x => x.Value).Column("Value"); 
      ReferencesAny(x => x.Member) 
       .EntityTypeColumn("MemberType") 
       .EntityIdentifierColumn("MemberId") 
       .IdentityType<Int32>() 
       .AddMetaValue<ExpressMember>("Express") 
       .AddMetaValue<Member>("Enterprise"); 

     } 
    } 

兩個成員表都具有帶升序值的整數ID。當我嘗試撤回與企業成員10相關的權限時,我將獲得與Express Member 10相關的權限集。其他兩個表都映射到舊學校hbm映射文件。

我錯過了一些明顯的東西嗎?我正在使用NHibernate 2.1和FluentNhibernate 1.1

回答

1

似乎總是這樣,當我發佈在Stackoverflow上時,我正在成爲一個完整的goober並且失去了明顯的東西,清除了一個良好的夜間休息和一些咖啡因。我需要查看ExpressMember和Member類的映射。發現那裏的袋子聲明沒有按照適當的對象類型進行過濾。起初,我認爲我已經做出了突破性的改變,實際上它實際上是一個非常古老的問題。兩種不同類型成員之間的id號碼衝突在很長一段時間內並不是一個問題,因爲快速成員通常擁有所有權限或不具有所有權限,大多數較老的成員(先在管理員/ plebe方案,隨後將打破特權)。

1

我實際上使用.Where()找到了解決方案。 我的情況有點不同,我有objectA和objectB。 objectA包含objectB,但objectB還包含一組objectB。

「對象A」:{ 「someProp」: 「(字符串)」, 「對象B」:{ 「someProp」: 「(字符串)」, 「comeCol」:[ 「(對象B)」 ] } }

因此,objectB的「Parent」屬性可以是objectB或objectA類型,這就是爲什麼我需要在ObjectB映射中使用ReferencesAny的原因。

映射看起來像

 ReferencesAny(x => x.Parent) 
      .IdentityType<int>() 
      .MetaType<string>() 
      .EntityTypeColumn("ParentType") 
      .EntityIdentifierColumn("ParentId") 
      .AddMetaValue<objectA>("E") 
      .AddMetaValue<objectB>("S") 
      .Access.Property() 
      .LazyLoad() 
      .Cascade.All(); 

這一切運作良好保存時,不過,我的問題,當檢索,因爲框架沒有被告知要檢索的,簡單地檢索到的一切發生。

所以,現在這裏是收集的是固定的問題的映射:

 HasMany(x => x.objectBs) 
      .KeyColumn("ParentId") 
      .Where("ParentType = 'S'") 
      .Cascade.All() 
      .LazyLoad(); 

希望這將有助於任何人在同樣的情況:)