Я новичок в EF6, это побочный проект для меня, и я изо всех сил пытаюсь понять, как удалить / изменить дочерние строки. Я обычно проверяю это вручную, но я занимаюсь расследованиями, повышающими продуктивность.

У меня есть следующий JSON для моей модели нокаута.

public JsonResult DetailsData(int? id)
{
    var result = from p in db.People
        where p.Id == id
        select new
        {
            p.Id,
            p.FirstName,
            p.SecondName,
            SicknessRecords = from s in p.SicknessRecords
                              select new
                              {
                                  s.Id,
                                  s.Description,
                                  s.Occurred,
                                  s.PersonId
                              }
        };

    return Json(result.First(), JsonRequestBehavior.AllowGet);
}

А затем последующее получение после редактирования.

[HttpPost]
public JsonResult DetailsData(Person model)
{
    if (ModelState.IsValid)
    {   //db.SaveChanges();
    }

    return null;
}

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

Обновление:

[HttpPost]
public JsonResult DetailsData(Person model)
{
    if (ModelState.IsValid)
    {
        var item = (from p in db.People
            where p.Id == model.Id
            select p).First();

        var removedRecords = item.SicknessRecords.Except(model.SicknessRecords).ToList();
        foreach (var record in removedRecords)
        {
            item.SicknessRecords.Remove(record);
        }

        db.SaveChanges();
    }
    return null;
}
0
RubbleFord 6 Фев 2014 в 01:28

1 ответ

Лучший ответ

Вы знаете, что изменилось, а это значит, что вам нужно заново выбрать первоначального человека из базы данных. Тогда вы можете просто сделать:

var removedRecords = person.SicknessRecords.Except(model.SicknessRecords);
for (var record in removedRecords)
{
    person.SicknessRecords.Remove(record);
}

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

0
Chris Pratt 6 Фев 2014 в 01:53
Я изменил код в соответствии с вашим предложением и теперь получаю следующее исключение: связь не может быть изменена, потому что одно или несколько свойств внешнего ключа не допускают значения NULL. При изменении отношения для соответствующего свойства внешнего ключа устанавливается значение NULL. Если внешний ключ не поддерживает нулевые значения, должна быть определена новая связь, свойству внешнего ключа должно быть присвоено другое ненулевое значение или несвязанный объект должен быть удален.
 – 
RubbleFord
6 Фев 2014 в 10:15
Пришлось добавить db.Entry (record) .State = EntityState.Deleted; в foreach.
 – 
RubbleFord
6 Фев 2014 в 10:44
Вам не пришлось бы этого делать, если вы действительно экономите person, а не model.
 – 
Chris Pratt
6 Фев 2014 в 19:53