在实体框架中,如何在关联上指定条件?

时间:2009-06-17 18:01:13

标签: entity-framework

我有一个带关联表的关系模型。但除了相关的键,这个表还有一个标志。我想定义两个关联:一个是标志为真,另一个是假。 EF设计人员可以向实体添加条件,但不能为关联添加条件。

关联表如下所示:

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

我想在User实体和Privilege实体之间创建两个关联:PrivilegesGranted和PrivilegesDenied。

1 个答案:

答案 0 :(得分: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。

解决此问题的方法是在每个关联的Insert和Delete sprocs中,基本上可以让它们更改User和Privilege对的当前行,如果存在则使用正确的IsGranted值更新它,如果不是,则创建它它,即使它成为一个upsert。

让我知道你怎么去这里

亚历