2009-06-17 62 views
3

我有一個與關聯表的關係模型。但除了相關的鍵之外,這張表還有一個標誌。我想定義兩個關聯:一個標誌是真的,另一個是假的。 EF設計師可以爲實體添加條件,但不能添加到關聯中。在實體框架中,如何在關聯中指定條件?

的關聯表看起來是這樣的:

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

我想創建用戶實體和權限實體之間兩個協會:PrivilegesGranted和PrivilegesDenied。

回答

2

你不能直接通過設計者做到這一點。

但是,在使用定義查詢和創建和刪除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值更新它(如果不存在)創建它,即使它成爲一個upsert。

讓我知道你在這裏

怎麼走亞歷克斯