質問

NHibernateを構成して、私のシナリオであるオブジェクト化された関係を持つ多対多のマップをサポートする方法に関する回答を探しています。

他のPerson:sとの関係を持つPerson:sのコレクションがあります。各リレーションには、リレーションのタイプを指定する属性があります。 RDBでは、これはそのテーブルで指定されたリレーションタイプを持つ多対多テーブルを使用することで行われます。 「親しい友人」および「arch-enemy」。

Personオブジェクトを照会して、関連するすべてのPersonをタイプ別に返すことができるようにしたい

<IList>Person myEnemies =  myPerson.getRelatedPersons(relationType.Enemy)

または

<IList>Person myFriends = myPerson.getRelatedPersons(relationType.Friend)

別の(拡張性の低い)ソリューションは、クラスで静的に他のリレーションが存在することを指定することです:

public class Person   
{   
  public virtual int Id { get; private set; }   
  public virtual string FirstName { get; set; }   
  public virtual string LastName { get; set; }   
  public virtual IList<Person> Friends { get; set; }   
  public virtual IList<Person> Enemies { get; set; }   
}

今、レガシーデータベースを使用する必要があります、&quot; Person&quot;テーブルと&quot; PersonPerson&quot;表。 「PersonPerson」テーブルは、リレーションタイプを整数として保持します。

これまでのところ以下のような構文を使用してこれを実行しようとして成功していません...

// How to specify type=1  here?
HasManyToMany(x => x.Friends).WithTableName("Person_Person"); 

// How to specify type=2  here?
HasManyToMany(x => x.Enemies).WithTableName("Person_Person"); 

(流(な)NHibernateでこれをマッピングするためのヒント/解決策はありますか?

BR

/ Jens

役に立ちましたか?

解決

最初に話す例は、継承マッピングを調査する必要があるように聞こえますが、関連する追加のテーブルでどのように機能するかはわかりません。

2番目の例では、Where句を使用できるはずです。

HasManyToMany(x => x.Friends)
  .WithTableName("Person_Person")
  .Where("type = 2");
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top