У меня есть небольшая программа, которая использует 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 за сценой? Отражение?
Кто-нибудь, пожалуйста, дайте мне несколько советов.