保存附加的实体时,EF Core引发DbUpdateConcurrencyException

时间:2019-02-08 23:08:20

标签: entity-framework ef-core-2.0 ef-core-2.1 ef-core-2.2

我想更新实体的某些列而不将整个实体加载到内存中。基于SO post,我正在尝试实现我的逻辑。建议的答案是使用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实例中,可以吗?

0 个答案:

没有答案