У меня есть веб-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",
}
Любая помощь будет высоко оценена. Спасибо.