При сохранении изменений в моей базе данных возвращается исключение со следующим сообщением:
Свойство 'OrderId' для типа сущности 'Order.CustomerDeliveryDetails # CustomerDetails' является частью ключа и поэтомуне может быть изменено или помечено как измененное.Чтобы изменить принципала существующей сущности с идентифицирующим внешним ключом, сначала удалите зависимую и вызовите «SaveChanges», затем свяжите зависимую с новым принципалом.
База данных реализована с помощью ядра инфраструктуры сущностей сподход «сначала код».Order.CustomerDeliveryDetails
является собственным типом (типа CustomerDetails
) сущности Order
.CustomerDetails
не имеет свойства с именем OrderId
.Как я понимаю, OrderId
- это неявный ключ , сгенерированный ядром платформы сущностей как свойство тени .
Классы структурированы следующим образом:
public class Order
{
public int Id { get; set; }
public CustomerDetails CustomerDeliveryDetails { get; set; }
}
[Owned]
public class CustomerDetails
{
public string Street { get; set; }
}
Объект обновляется следующим образом:
var order = await orderContext.Orders
.Where(o => o.Id== updateOrder.Id)
.FirstOrDefaultAsync();
order.CustomerDeliveryDetails.Street = updateOrder.CustomerDeliveryDetails.Street;
await orderContext.SaveChangesAsync();
Я не понимаю, как можно модифицировать OrderId
, когда к нему нельзя получить прямой доступ в коде.
Единственное, о чем я могу думать, что может вызвать эту ошибку, - это то, что это обновление выполняется на временной веб-работе в Azure.Эта догадка поддерживается тем фактом, что обновление проходит соответствующие юнит-тесты.Может ли это быть связано с условием гонки ?
Обновление:
Я вполне уверен, что ошибка происходит из-за какого-либо состояния гонки,Запланированная веб-работа загружает список заказов, которые необходимо обновлять каждые 2 минуты.Обновление работает нормально до тех пор, пока список содержит менее + -100 заказов, но начинает сбой, как только этот список становится длиннее.
Возможно, веб-задание не сможет завершить обновление всех заказов в течение 2 минут, если списокдобирается до длинного.
Контекст добавляется через внедрение зависимостей следующим образом:
serviceProvider.AddDbContext<OrdersContext>(options => options.UseSqlServer(ctx.Configuration["ConnectionString"], sqlOptions => sqlOptions.EnableRetryOnFailure()));
Мой лучший аргумент в пользу того, что контекст разделяется между несколькими вызовами веб-задания, что вызываетошибки.