EF Core DB 上下文跟踪生命周期和范围
EF Core DB context tracking lifetime and scope
我在 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 操作方式的预期且可靠的行为,还是应该避免并应在块内添加另一个保存操作?
更改跟踪是在每个 DbContext 级别上进行的,因此只要它在不同范围内使用相同的上下文(在您的情况下似乎是这样),那么这是有意且可靠的行为是的。
这是预期的行为。所做的所有更改都保存在 DbContext 级别。
因此,当您执行 result.MyColumn -= 42;
时,您实际上是在更新底层 DbContext 对象,该对象跟踪所有更改,并知道是否需要更新数据库
我在 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 操作方式的预期且可靠的行为,还是应该避免并应在块内添加另一个保存操作?
更改跟踪是在每个 DbContext 级别上进行的,因此只要它在不同范围内使用相同的上下文(在您的情况下似乎是这样),那么这是有意且可靠的行为是的。
这是预期的行为。所做的所有更改都保存在 DbContext 级别。
因此,当您执行 result.MyColumn -= 42;
时,您实际上是在更新底层 DbContext 对象,该对象跟踪所有更改,并知道是否需要更新数据库