Я хотел обновить определенные столбцы объекта, не загружая весь объект в память.На основании ТАК я пытаюсь реализовать мою логику.Предложенный ответ использует EF 4.1, но я предполагаю, что то же самое будет работать в EF Core.(я использую EF Core)
В таблице больше столбцов, но для краткости здесь показаны только немногие
[LearningDocuments]
LearningDocumentId (int),
LearningRequestID (int) (foriegnkey),
IsDone (bit),
CreatedDateTime (datetime),
ModifiedDateTime (dateTime)
VersionStamp (timestamp)
Код для обновления определенных столбцов
var dbContext = GetDBContext();
var documents = await dbContext.LearningDocuments
.Where(x => x.LearningRequestID == 1234)
.Select(x => new LearningDocument()
{
LearningDocumentId = x.LearningDocumentId ,
IsDone = x.IsDone,
ModifiedDateTime = x.ModifiedDateTime
})
.ToListAsync()
.ConfigureAwait(false);
documents.ForEach(d =>
{
d.IsDone = true;
d.ModifiedDateTime = DateTime.UtcNow;
dbContext.LearningDocuments.Attach(d);
dbContext.Entry(d).Property(x => x.IsDone).IsModified = true;
dbContext.Entry(d).Property(x => x.ModifiedDateTime).IsModified = true;
});
await dbContext.SaveChangesAsync().ConfigureAwait(false);
Однако при сохранении изменений возникает исключение:
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: ожидается, что операция с базой данных затронет 1 строку (и), но фактически затронет 0 (и) строку (и).Данные могут быть изменены или удалены, так как объекты были загружены
LearningDocument
является объектом.Я проецирую результат в новые LearningDocument
экземпляры, выбирая только необходимые столбцы, это нормально?