EF Core: обновление сущности без предварительного запроса - PullRequest
0 голосов
/ 13 октября 2019

Я ищу способ обновить свойство сущности, зная его первичный ключ, без предварительного запроса.

Я пришел к следующему решению:

var order = new OrderEntity()
{
    Id = 5
};

db.Orders.Attach(order).State = EntityState.Unchanged;

order.Name = "smth";

db.SaveChanges();

Что, кажется, работает нормально, поскольку сгенерированный SQL - это именно то, что я ожидаю:

UPDATE "Orders" SET "Name" = @p0
WHERE "Id" = @p1;

Вопрос : это правильный способ сделать это?

Я не могу найти подтверждения об этом ни в официальной документации, ни где-либо еще в Интернете. Подобные вопросы касаются Entity Framework (не-Core), и они, похоже, используют разные стратегии, например установку EntityState.Modified вместо Unchanged. Я тоже это попробовал, но он дает эффект обновления всех свойств, а это не то, чего я хочу достичь. Поэтому мне интересно, есть ли что-то, чего мне не хватает в решении выше.

Спасибо.

1 Ответ

1 голос
/ 13 октября 2019

Документация для DbContext.Attach Method гласит:

Начинает отслеживать заданную сущность и записи, достижимые из данной сущности, используя состояние Неизменное с помощьюпо умолчанию, но см. ниже случаи, когда будет использоваться другое состояние.
[...]
Для типов сущностей с сгенерированными ключами, если для сущности установлено значение первичного ключа, тогда она будет отслеживаться в Без изменений состояние. Если значение первичного ключа не установлено, оно будет отслеживаться в состоянии Added .
[...]
Для типов сущностей без сгенерированных ключей устанавливается состояние всегда Без изменений .
[...]

Поэтому установка состояния на Unchanged даже не требуется.

Но будьте осторожны. Если вы установите, например, order.Amount = 0m;, чтобы очистить сумму, это не будет работать, так как никаких изменений не будет обнаружено. Пишите

var order = new OrderEntity()
{
    Id = 5,
    Amount = 1.00m; // Dummy value unequal 0.00m
};
db.Orders.Attach(order);

// Make the change    
order.Amount = 0.00m; // Now, this change will be detected.

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