我想更新实体的某些列而不将整个实体加载到内存中。基于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
实例中,可以吗?