2011-07-21 9 views
1

間違ったタイプ引き戻す:NHibernateはReferencesAny私は、次のフィールドがあるテーブルと呼ばAdministratorPrivilages持っ

  • ID
  • リスト項目
  • MEMBERID
  • のmemberType

メンバーは2種類あります(Enterprise aエクスプレス)。エンタープライズメンバーはエンタープライズテーブルに存在します。 ExpressメンバーはExpressMemberテーブルに住んでいます。私は流暢なマッピングをそうしようとしました。

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に投稿すると、常にそうであるように、私は完璧なガチョウとなっていて、良い夜の残りといくつかのカフェイン。 ExpressMemberクラスとMemberクラスのマッピングを調べる必要がありました。オブジェクトのタイプによって適切にフィルタリングしなかったバッグ宣言を適切に出力します。最初は、私は実際には非常に古い問題だったときに、私は壊れた変更を加えたと思った。 2つの異なるタイプのメンバー間のID番号の衝突は、非常に長い間は問題ではありませんでした。なぜなら、Expressメンバーは通常、すべての許可またはなしのいずれかを持っています。後で特権を持つplebeスキーム)。

1

私は実際に.Where()を使って解決策を見つけました。 私の状況は少し異なります。私はobjectAとobjectBを持っています。 objectAにはobjectBが含まれていますが、objectBにはobjectBも含まれています。

"ObjectAに":{ "someProp": "(文字列)"、 "ObjectBに":{ "someProp": "(文字列)"、 "comeCol":[ "(ObjectBに)" ] }}

だから、ObjectBにの「親」プロパティは、私がObjectBにのマッピングでReferencesAnyを使用するために必要な理由である、タイプをObjectBかをObjectAのいずれかとすることができます。フレームワークが取得するために何を言われて、単にすべてを取得していなかったので、検索する際に

マッピングを保存するときにこのすべてがうまく機能

 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(); 

それは同じ状況で、誰を助けることを願っています:)

関連する問題