Использование структуры объекта для обнаружения изменений в связанной таблице и соответствующих действий для вставки и удаления - PullRequest
0 голосов
/ 26 мая 2010

Допустим, у меня есть таблица Person, таблица Role с таблицей трелей PersonRoles, связывающая их как много со многими.

Я создаю нового человека и назначаю ему 2 роли (роль 1, роль 3).

Затем я хочу отредактировать этого человека; поэтому я получаю их данные и связываю их роли с флажками. Я изменяю значения (отмените выбор роли 1 и выберите роль 2 вместо этого), а затем отправляю эти данные обратно через модель представления.

Могу ли я тогда заставить Entity Framework обновить эти роли для меня, как при удалении записи в PersonRoles для роли 1, а затем добавить новую запись как роль 2? Или я должен сам сделать логику для этого?

Что-то вроде ** этого ** Я надеялся, но, очевидно, не работает.

[HttpPost]
    public ActionResult Edit(int id, PersonViewModel model)
    {
        if (ModelState.IsValid)
        {
            var person= GetPerson(id);
            person.Name= model.Name;
            person.Age = model.Age;

           ICollection<Roles> personroles = new Collection<Roles>();
            foreach (string rId in model.Roles)
            {
                personroles.Add(this.RoleRepository.Single(r => r.Id.ToString() == rId));
            }

            **person.Roles = personroles;**

            this.PersonRepository.SaveChanges();
            return RedirectToIndex(personId);
        }

        return View();
    }

Ура, Кохан

1 Ответ

2 голосов
/ 26 мая 2010

Дьявол кроется в деталях, и вы ничего не даете, но обычно да, EF может это сделать.

Наилучший подход состоит в том, чтобы PersonRoles имел только два столбца: FK для Person и Role, с каскадным удалением на обоих, и превращение PK в составной ключ на обоих. Если у вас нет других столбцов, EF включит эту таблицу в отношение многие ко многим, которое будет вести себя так, как вы ожидаете.

Обновление: Поскольку вы сейчас добавили источник, давайте исправим его (не проверено; это не в моей голове):

    if (ModelState.IsValid)
    {
        var person= GetPerson(id);
        person.Name= model.Name;
        person.Age = model.Age;

        var rolesToAdd = model.Roles.Where(mr => !person.Roles.Any(pr => pr.Id == mr);
        var rolesToRemove = person.Roles.Where(pr => !model.Roles.Any(mr => pr.Id == mr);

        foreach (string rId in rolesToAdd)
        {
            person.Roles.Add(this.RoleRepository.Single(r => r.Id.ToString() == rId));
        }
        foreach (string rrId in rolesToRemove)
        {
            var remove = person.Roles.Where(r => r.Id == rrId).Single();
            person.Roles.Remove(remove);
        }

        this.PersonRepository.SaveChanges();
        return RedirectToIndex(personId);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...