EF Core создает исключение DbUpdateConcurrencyException при сохранении прикрепленных объектов - PullRequest
0 голосов
/ 09 февраля 2019

Я хотел обновить определенные столбцы объекта, не загружая весь объект в память.На основании ТАК я пытаюсь реализовать мою логику.Предложенный ответ использует 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 экземпляры, выбирая только необходимые столбцы, это нормально?

...