Я хотел бы обновить запись в БД с помощью Entity Framework Core, используя один вызов SQL UPDATE только с условием, что запись не удалена.
Этот код представляет то, что я хочу сделать, но вызываю 2 вызова БД (выбрать + обновить):
var book = await context.Books.Where(b => b.Id == bookId && !m.Deleted).FirstOrDefaultAsync();
if (usr == null) return null;
book.ReturnDate = DateTime.Now;
await context.SaveChangesAsync();
Этот код лучше: только один вызов БД, но не включает условие !m.Deleted (и проверку нуля?).
var book = new Book() {
Id = bookId,
ReturnDate = DateTime.Now
};
this.context.Books.Attach(book);
this.context.Entry(book).Property(p => p.ReturnDate).IsModified = true;
await context.SaveChangesAsync();
Как это можно написать в EF Core, чтобы он генерировал только один вызов UPDATE? Что-то вроде этого:
UPDATE Books SET ReturnDate = GetDate() WHERE Id = BookId AND Deleted = 0
Возможный дубликат Как добавить условия для обновления записи с помощью структуры сущностей linq-to-entities
[ConcurrencyCheck] указывает EF включить свойство в UPDATE в части WHERE. Это хорошо. Однако он выдает исключение, когда условие не выполняется.
Как вы думаете, можно ли обычно использовать IsConcurrencyToken для формирования условия where в UPDATE? Я думаю, что это просто обходной путь.





См. stackoverflow.com/questions/40048825/…