обновить две связанные модели и параллелизм в Entity Framework - PullRequest
0 голосов
/ 16 ноября 2011

В моем приложении ASP.NET MVC я пытаюсь обновить две связанные модели следующим образом:

if (ModelState.IsValid) {

    _accommpropertyseasonrepo.Edit(accommPropertySeasonCreateViewModel.AccommPropertySeason);
    _accommpropertyseasonrepo.Save();

    _accommpropertyseasondetailrepo.Edit(accommPropertySeasonCreateViewModel.AccommPropertySeasonDetail);
    _accommpropertyseasondetailrepo.Save();

    return RedirectToAction("Details", new { id = id });
}

Первый проходит без проблем, но когда он пытается обновить второй, происходит параллелизм и выдается следующая ошибка:

Оператор сохранения, вставки или удаления, затронутый неожиданно количество строк (0). Объекты могут быть изменены или удалены с объекты были загружены. Обновить записи ObjectStateManager

Какой способ достижения того, что я пытаюсь сделать здесь?

UPDATE

Вот метод _accommpropertyseasondetailrepo Edit:

public void Edit(AccommPropertySeasonDetail entity) {

    _context.Entry(entity).State = System.Data.EntityState.Modified;
}

Вот метод _accommpropertyseasonrepo Edit:

public void Edit(AccommPropertySeason entity) {
            _context.Entry(entity).State = System.Data.EntityState.Modified;
        }

ОБНОВЛЕНИЕ 2

Вот весь метод действия:

public ActionResult SeasonEdit_post(int id, int subid, 
    [Bind(Exclude = 
        "AccommPropertySeason.CreatedBy,AccommPropertySeason.CreatedOn")]
    AccommPropertySeasonCreateViewModel accommPropertySeasonCreateViewModel) {

    if (ModelState.IsValid) {

        _accommpropertyseasonrepo.Edit(accommPropertySeasonCreateViewModel.AccommPropertySeason);
        _accommpropertyseasonrepo.Save();


                    _accommpropertyseasondetailrepo.Edit(accommPropertySeasonCreateViewModel.AccommPropertySeasonDetail);
        _accommpropertyseasondetailrepo.Save();

        return RedirectToAction("Details", new { id = id });
    }

    return View(accommPropertySeasonCreateViewModel);
}

UPDATE

Brutal Truth: я забыл следующую строку кода в моем представлении, поэтому модель возвращалась без PK:

@Html.HiddenFor(m => m.AccommPropertySeasonDetail.AccommPropertySeasonDetailID)

Проблема решена сейчас!

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Может быть, это вполне веская причина, по которой вы делаете это, но не зная этой причины, это выглядит как очень плохой способ выполнить то, что вы делаете.сущность существует, и затем, если это так, вы должны обновить сущность и сохранить эти изменения.

var entity = repository.GetAccomPropertySeason(id);

if( entity == null )
   return View("NotFound");

// update the model here
repository.SaveChanges();

Как вы написали это, если объект на самом деле не существует, то вы получите этоошибка.

Вы уверены, что ваш объект Details имеет правильный родительский идентификатор?Это связано правильно?Судя по всему, вы говорите контексту, что он существует, и вы собираетесь его обновить, но контекст не может найти сущность, когда он вызывает SaveChanges.

Если целью было создание новогообъект (не изменяйте существующий), тогда вам следует вместо этого установить состояние на.

1 голос
/ 17 ноября 2011

Копировать / вставить из моего комментария к ОП

Не похоже, что это имеет какое-либо отношение к параллелизму. По какой-то причине при написании операторов SQL Update Entity Framework ожидает обновления элементов, а этих элементов там нет. Есть ли вероятность того, что вы попытаетесь запустить тот же код в LINQPad и посмотреть результаты SQL, чтобы увидеть, что происходит?

...