EF Core DB上下文跟踪生存期和范围

时间:2019-01-03 11:39:35

标签: c# entity-framework asp.net-core entity-framework-core 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操作的预期和可靠行为吗,还是应该避免它,而应该在块内添加另一个保存操作?

2 个答案:

答案 0 :(得分:2)

这是预期的行为。所有所做的更改都保存在DbContext级别。

因此,当您执行result.MyColumn -= 42;时,实际上是在更新基础DbContext对象,该对象跟踪所有更改,并知道是否需要更新数据库

答案 1 :(得分:1)

更改跟踪是在每个DbContext级别上进行的,因此,只要在不同范围内使用相同的上下文(在您的情况下似乎是这样),则这是有目的的,并且是可靠的行为。