Self-tracking Entity - Пытается вставить неизмененный объект при добавлении в коллекцию - PullRequest
3 голосов
/ 16 марта 2011

Использование объектов EF4 Self-tracking.

У меня есть объект "Пользователь", у которого есть коллекция "Групп", к которым может принадлежать пользователь.Я хочу добавить / удалить несколько «Групп» для этого пользователя, учитывая только список идентификаторов групп.

    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().В сообщении об ошибке указывается, что сущности «Группа» не позволяют null для свойства Name.

Это ожидается, если бы я был INSERTING новыми группами, но это, очевидно, не то, что япытаюсь сделать.Как я могу решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Вы на самом деле вставляете.Создав новую группу и добавив ее в коллекцию, по сути, вы говорите, вот новая группа, добавьте ее.Вам необходимо сначала загрузить группу из базы данных, чтобы активировать отслеживание по ней.затем добавьте группу в коллекцию групп пользователей.

Решение amit_g будет работать, но приведет к нескольким вызовам БД (вызов БД на группу)Я бы предварительно загрузил все группы заранее

1 голос
/ 16 марта 2011

Попробуйте с

user.Groups.Add(Context.Groups.FirstOrDefault(g => g.ID == group));
...