Entity Framework Core не только обновляет строку в базе данных, но также изменяет значение объекта сущности, даже если оно доступно только для чтения. - PullRequest
0 голосов
/ 11 марта 2020

У меня есть небольшая программа, которая использует Sqlite в качестве базы данных в памяти и Entity Framework Core в качестве сопоставителя объектных отношений. В одном месте мне нужен кусок кода, чтобы сначала проверить, существует ли сущность. Если так, обновите сущность новыми значениями и передайте старую сущность другой службе для дальнейшей обработки.

Вот реализация.

var subscriptionByVariable = _subscriptionContext.subscriptions.SingleOrDefault<Subscription>(s => s.machineId == subscription.machineId && s.variable == subscription.variable);
if (subscriptionByVariable != null)
{
    _dataBlockSubscriptionService.Remove(subscriptionByVariable);
    _subscriptionContext.Entry(subscriptionByVariable).Property(s => s.plcId).CurrentValue = subscription.plcId;
    _subscriptionContext.Entry(subscriptionByVariable).Property(s => s.address).CurrentValue = subscription.address;
    _subscriptionContext.Entry(subscriptionByVariable).Property(s => s.subscribeInterval).CurrentValue = subscription.subscribeInterval;
    _subscriptionContext.SaveChanges();
}

Пока все хорошо, все работает, как ожидалось , Однако, если я переместу _dataBlockSubscriptionService.Remove(subscriptionByVariable); на строку после _subscriptionContext.SaveChanges();, результат будет другим.

После сеанса отладки я выяснил, что subscriptionByVariable был изменен на обновленный после _subscriptionContext.SaveChanges(); , Почему это так? В частности, все свойства subscriptionByVariable доступны только для чтения. Итак, как это вообще возможно? Что за волхвы c за сценой? Отражение?

Кто-нибудь, пожалуйста, дайте мне несколько советов.

...