我收到错误消息'操作失败:由于一个或多个外键属性不可为空,因此无法更改关系。使用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链接到用户创建/更新)时会发生这种情况。
答案 0 :(得分:0)
在这一行:
entities.Users.Remove(userInDB); // rowversion requirement
所有角色都被标记为已删除,从而导致问题。
我需要移动这一行:
userInDB.Roles.Clear();
在上面。