Сбой ASP.NET PUT с DbUpdateConcurrencyException - PullRequest
0 голосов
/ 29 октября 2018

У меня есть веб-API, у которого есть скаффолд ApiController. В методе обновления (PUT) следующий сегмент кода обновляет сущность в базе данных.

_context.Entry(customers).State = EntityState.Modified;

try
{
    await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
    if (!CustomersExists(id))
    {
        return NotFound("Not found");
    }
    else
    {
        throw;
    }
}

Но я обнаружил, что это только обновляет атрибуты только в модели Customer, не распространяется на объекты, на которые есть ссылки. Например, таблица «Есть заказы», ​​в которой хранятся заказы каждого клиента.

public partial class Customers
{
    public Customers()
    {
        Orders= new HashSet<Orders>();
    }

    public string Description { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Orders> Orders { get; set; }
}

Таким образом, запрос на обновление клиента может также содержать обновленную информацию о заказе. Но,

_context.Entry(customers).State = EntityState.Modified; 

эта строка не может обновить таблицу Orders, если есть изменение. Опробовав много методов, я обнаружил, что

_context.Customers.Update(customers);

удается успешно все обновить. Но проблема в том, что если в текущем запросе есть только 2 заказа, а в запросе на обновление есть дополнительный заказ (3 заказа), то снова происходит сбой обновления.

Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: База данных ожидается, что операция повлияет на 1 строку (и), но фактически затронула 0 строку (и). Данные могут быть изменены или удалены с момента загрузки объектов.

Редактировать : Нет никаких подключений к базе данных. Так что исключение параллелизма невозможно.

Мой запрос JSON выглядит следующим образом.

{
   "orders":[
      {
         "id": "1",
         "date": "2018/10/29"
      },
      {
      },
   ],
   "name":"test_name",
   "description":"test_description",
}

Любая помощь будет высоко оценена. Спасибо.

1 Ответ

0 голосов
/ 09 марта 2019

У меня была такая же проблема. Я использую EF Core 2 для нового проекта. Метод действия после редактирования генерировал DbUpdateConcurrencyException при любом обновлении.

_context.Update(participant);
await _context.SaveChangesAsync();

Мне пришлось заменить две строки выше на это:

var participantToUpdate = await _context.Participants.SingleOrDefaultAsync(p => p.ParticipantID == participant.ParticipantID);
if (await TryUpdateModelAsync<Participant>(participantToUpdate, "", p => p.Nom, p => p.Email))
{
    await _context.SaveChangesAsync();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...