2009-06-17 30 views
3

私は、関連テーブルを持つリレーショナルモデルを持っています。しかし、関連するキーに加えて、このテーブルにもフラグがあります。私は二つの関連付けを定義したいと思います:一つはフラグが真、もう一つは偽です。 EFデザイナは、エンティティに条件を追加できますが、関連には追加できません。Entity Frameworkでは、関連付けの条件を指定するにはどうすればよいですか?

連想テーブルは次のようになります。PrivilegesGrantedとPrivilegesDenied:

UserPrivilege 
------------- 
UserId int (FK1) 
PrivilegeId int (FK2) 
IsGranted bit 

私はUserエンティティおよび特権のエンティティの間に2つの関連付けを作成したいと思います。

答えて

2

これはデザイナーから直接行うことはできません。

しかしこれは、DefiningQueryとCreate and Delete sprocsを使用してXMLで可能です。詳細については、私のブログのこの古い記事を参照してください:Associations with Payloads

ちょっと面白いのは、PKはUserIdとPrivilegeIdだけであると仮定します。これは、ユーザーが特定の特権を与えられて同時に拒否されないことを意味します。

は、だから、このようなコードを書いた場合:

Privilege p = user.Granted.First(); 
user.Granted.Remove(p); 
user.Denied.Add(p); 
ctx.SaveChanges(); 

更新順序が重要です。両方の関連付けに対してDefiningQueryを使用しているため、EFはそれらが関連していることを知らず、更新を実行する前に削除を行う必要があります。

あなたはPK違反で終わるかもしれません。

この問題を解決する方法は、各関連の挿入と削除のsprocsです。ユーザーと権限のペアの現在の行を変更することができます。存在する場合は正しいIsGranted値で更新しますそれを作成する、すなわちそれをアップサルトにする。

私はあなたがアレックス

ここ

行く方法を教えてください

関連する問題