Entity Framework Core - модифицированный ключ для собственного типа - PullRequest
1 голос
/ 20 сентября 2019

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

Свойство '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()));

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

1 Ответ

0 голосов
/ 20 сентября 2019

Это сводится к вашим отношениям с базой данных. Используете ли вы базу данных сначала или код первым?Как определяются модели?Какая связь между таблицами Order, CustomerDetails и CustomerDeliveryDetails?Пожалуйста, предоставьте код, и я смогу помочь вам с решением.

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