3

使用 EF4 自我跟踪实体。

我有一个“用户”实体,其中包含用户可以属于的“组”集合。我想给这个用户添加/删除一些“组”,只给一个组 ID 列表。

    public void UserAddGroups(int userID, List<int> groups)
    {
        var user = Context.Users.Include("Groups").FirstOrDefault(u => u.ID == userID);
        if (user != null)
        {
            // Iterate through the groups that the user already belongs to.
            foreach (var group in user.Groups.ToList())
            {
                // Remove any groups from the user if the new list does not have it.
                if (!groups.Contains(group.ID)) user.Groups.Remove(group);
                // Else remove it from the list of new groups to avoid duplication.
                else groups.Remove(group.ID);
            }
            // Iterate through the group list and add it to the user's list
            // (only a stubby is created)
            foreach (var group in groups) user.Groups.Add(new Group { ID = group }.MarkAsUnchanged());
            Context.Users.ApplyChanges(user);
            Context.SaveChanges();
        }
    }

此方法中的结果在 处引发错误Context.SaveChanges()。错误报告“组”实体不允许属性nullName

如果我要插入新组,这是可以预料的,但这显然不是我想要做的。我该如何解决这个问题?

4

2 回答 2

2

您实际上正在插入。通过创建一个新组并将其添加到您所说的本质上的集合中,现在添加一个新组。您需要先从数据库加载组以激活对其的跟踪。然后将该组添加到用户组集合中。

amit_g 的解决方案将起作用,但会导致多个数据库调用(每组一个数据库调用)。我会预先加载所有组

于 2011-03-16T00:45:38.993 回答
1

试试看

user.Groups.Add(Context.Groups.FirstOrDefault(g => g.ID == group));
于 2011-03-15T23:00:46.883 回答