代码之家  ›  专栏  ›  技术社区  ›  Michael L Perry

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

  •  3
  • Michael L Perry  · 技术社区  · 15 年前

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

    关联表如下所示:

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

    我想在用户实体和特权实体之间创建两个关联:privilegesgranted和privilegesdenied。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Alex James    15 年前

    你不能直接通过设计师来做到这一点。

    但这在XML中是可能的,可以使用definingquery和create和delete存储过程。更多信息,请查看我博客上的这篇旧文章: Associations with Payloads .

    唯一有趣的是,我假设pk只是userid和privilegid,这意味着一个用户不能同时被授予和拒绝一个特定的特权。

    因此,如果您编写这样的代码:

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

    更新排序很重要。因为您对这两个关联都使用了一个定义查询,所以EF不知道它们是相关联的,它需要先执行删除操作,然后才能进行更新。

    所以你可能会以违反pk而告终。

    解决此问题的方法是在每个关联的插入和删除存储过程中,您基本上可以让它们更改用户和特权对的当前行,如果存在,则使用正确的IsGranted值更新该行,如果不创建该行,即使其成为upsert。

    告诉我你怎么到这儿来

    亚历克斯