我在ASP.NET Core 2.2和EF中遇到了一些行为,我不确定它是否是预期的,尤其是它是否安全。
提供以下代码:
{
//...
if (condition)
{
var result = await MyDbContext.MyTable
.Where(data => data.Id == id)
.FirstOrDefaultAsync();
result.MyColumn -= 42;
}
//...more MyDbContext operations
await MyDbContext.SaveChangesAsync();
//...
}
EF Core成功查询了数据库,并相应地更新了MyColumn字段(在这种情况下,减42),甚至result
变量声明和减操作都在单独的块中完成(并隐含了作用域)。
这是EF操作的预期和可靠行为吗,还是应该避免它,而应该在块内添加另一个保存操作?
答案 0 :(得分:2)
这是预期的行为。所有所做的更改都保存在DbContext级别。
因此,当您执行result.MyColumn -= 42;
时,实际上是在更新基础DbContext对象,该对象跟踪所有更改,并知道是否需要更新数据库
答案 1 :(得分:1)
更改跟踪是在每个DbContext级别上进行的,因此,只要在不同范围内使用相同的上下文(在您的情况下似乎是这样),则这是有目的的,并且是可靠的行为。