EF - 针对特定边界案例

时间:2016-07-19 09:34:39

标签: entity-framework

我收到错误消息'操作失败:由于一个或多个外键属性不可为空,因此无法更改关系。使用Entity Framework 6.1时。我不明白的是为什么我只能获得一个特定的记录。

涉及三个表:User,Role,UserRoles。 UserRoles具有FK到用户和角色(链接表)。

EF(DB to Entities)构建了两个实体:User和Role。用户实体具有集合属性Roles和Role实体具有集合属性Users。我正在尝试更新用户的Roles属性中添加/删除现有角色的用户。

延迟加载已启用默认为false。以不连贯的方式工作。

userWithUpdatedData作为参数发送到此代码中:

using (entities = new Entities())
{
    try
    {
       var userQuery = entities.Users.AsQueryable();

       userQuery = userQuery.Include(u => u.Roles);

       User userInDB = (from u in userQuery
                      where u.id == userBDO.id
                      select u).FirstOrDefault();

       if (userInDB == null) return false;

       entities.Users.Remove(userInDB); // rowversion requirement

       entities.Users.Attach(userInDB);
       entities.Entry(userInDB).State = System.Data.Entity.EntityState.Modified;                    

       userInDB.Roles.Clear();  // remove all current roles

       // paint with new Roles
       List<int> roleIds = new List<int>();

       if (userWithUpdatedData.Roles != null)
       {
           foreach (Role r in userWithUpdatedData.Roles)
           {
                roleIds.Add(r.id);
           }
       }

       var roles = (from r in entities.Roles
                    where roleIds.Contains(r.id)
                    select r);

       foreach (Role role in roles)
       {
           userInDB.Roles.Add(role);
           entities.Entry(role).State = EntityState.Unchanged;
       }

       entities.SaveChanges();
   }
   catch(Exception e) {}
}

对于系统中的所有其他用户,此代码可以正常工作,但对于id = 1的单个用户(以及系统中的大多数活动),此代码将失败。当我删除更新ID为1的Roles用户的代码时,正确更新(当然没有角色)。

这段代码出了什么问题和/或为什么它只对一个实体失败而且对所有其他实体都能正常工作?

更新所以当用户尝试更新自己并且用户是一个或多个角色的作者(角色有一个FK链接到用户创建/更新)时会发生这种情况。

1 个答案:

答案 0 :(得分:0)

在这一行:

entities.Users.Remove(userInDB); // rowversion requirement

所有角色都被标记为已删除,从而导致问题。

我需要移动这一行:

userInDB.Roles.Clear();

在上面。