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 对象,该对象跟踪所有更改,并知道是否需要更新数据库