2009-07-23 12 views
2

、どのように次のシナリオをマッピングすることができます。私はUserProjectRoleための別々のテーブルとの関係のための第4テーブルを有するデータベースでIList値を持つIDictionaryをどのようにマップするのですか? NHibernateはを使用

public class User 
{ 
    public virtual IDictionary<Project, IList<Role>> ProjectAssignments { get; set; } 
} 

ご協力いただければ幸いです。

答えて

1

あなたがすることはできません - Ayende's blog discussing <map>

から、私は、私はまだ<マップ/>のすべてのオプションをカバーしていないことを指摘したいと思い、 は(IDictionaryを< K、が、さらに多くのオプションがあります、IList < V >>は、そうする必要がある問題のあるSQL文については、 をマップすることはできません)。

いくつかの中間エンティティ/コンポーネントが必要です。おそらく、ProjectAssignmentエンティティを使用して、User、Project、Roleの間のネーリアの関連付けを解消することができます。時間が経つにつれて余分な属性が増えるでしょう(時間の経過とともに割り当ての変更を追跡するので、StartDateEndDateプロパティ)。私は普通の1対多どんな味のよう独自の権利、およびUser.Assignmentsコレクションに永続クラスとしてProjectAssignmentをマッピングしたい

public class User { 
    // ... other attributes etc. 
    public virtual ISet<ProjectAssignment> Assignments {get;set;} 
} 

public class Project { 
    // ... other attributes etc. 
    public virtual ISet<ProjectAssignment> Assignments {get;set;} 
} 

public class Role { 
    // ... other attributes etc. 
} 

public class ProjectAssignment 
{ 
    public virtual Int64 {get;set;} 
    public virtual User User {get;set;} 
    public virtual Project Project {get;set;} 
    public virtual Role Role {get;set;} 
    // ... other attributes etc. 
} 

:よう

何か。 (あなたはフレームワークV3.5を使用している場合は、おそらくまたはILookup)最後に、私は辞書に詳細情報を抽出するためのメソッドを追加したい:ような何か:

ILookup<Project, Role> GetRolesByProject() { 
    return Assignments.ToLookup(x => x.Project, x => x.Role); 
} 
+0

私はすべてが起こっているかについて少し混乱していますフィットするように。あなたは、仲介実体がどのように見えるか、私がそれをどのようにマッピングするかの例を私に教えてください。 –

+0

私は今私の答えを拡張しました。 –

+0

コードのためにありがとう:)それは働いた! –