Entity Framework либо не обновляет, либо выдает исключение при попытке обновления - PullRequest
0 голосов
/ 23 апреля 2019

Я могу добавить объект, но при попытке обновить Entity Framework не работает. Вот что я делаю:

  1. Получить модель в действии фильтра в веб-API. Я ищу некоторые данные об этой модели в базе данных и использую их для изменения / гидратации различных частей модели. Да , так и должно быть.

  2. Контроллер работает. Контроллер ничего не делает, кроме передачи модели в репозиторий для сохранения.

  3. Репозиторий проверяет, существует ли модель с таким идентификатором в базе данных. Если это так, он пытается присоединиться, а затем сохранить.

Код:

_db.Airplanes.Attach(airplane);
// _db.Entry(airplane).State = EntityState.Modified; // doesn't do anything
_db.SaveChanges();

Это не работает. Вместо этого он выдает это сообщение об ошибке:

System.Data.Entity.Core.OptimisticConcurrencyException: 'Оператор хранения, вставки или удаления затронул неожиданное количество строк (0). Объекты могут быть изменены или удалены с момента загрузки объектов. См. http://go.microsoft.com/fwlink/?LinkId=472540 для получения информации о понимании и обработке исключений оптимистичного параллелизма. '

Возможно, проблема в том, что я изначально вернул сущность в Фильтр действий, и с тех пор она вышла из контекста или что-то в этом роде? В любом случае я не знаю, почему Entity Framework не позволяет мне просто добавить его обратно.

Редактировать : Я вынужден редактировать это, чтобы объяснить, как это не решается другим вопросом. ... ммм, это не так. Бремя доказывания должно лежать на лице, предъявляющем иск.

1 Ответ

0 голосов
/ 23 апреля 2019

Ответ состоял в том, что в моем фильтре действий я вызывал AirplaneRepository для получения идентификатора самолета.Хотя я использовал только идентификатор, я думаю, он все еще добавлял весь самолет в черный ящик (черный ящик структуры сущности).Решением было отсоединить самолет от EF.

AirplaneRepository.cs

async Task<Airplane> GetAirplane(int partId, bool detachFromEF = false)
{
    var airplane = await _db.Airplane.SingleOrDefaultAsync(c => c.partId == partId);

    if(detachFromEF)
    {
        _db.Entry(airplane).State = EntityState.Detached; // <-- the fix
    }

    return airplane;
}

async Task<int?> GetAirplaneId(int partId)
{
    var airplane = await GetAirplane(partId, true);
    return airplane == null ? (int?)null : airplane.AirplaneId;
}

}

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