EF Core 数据库上下文跟踪的生命周期和范围

4

我发现了一些与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个回答

3

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

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接