EF Core 更改跟踪,无需 DBContext

问题描述 投票:0回答:1

我正在为一个项目使用 Blazor 服务器端和 EF core

问题是,更改跟踪是多余的,因为建议使用数据库工厂创建短期上下文

例如

public class OrderService
{
    private readonly IDbContextFactory<ApplicationDbContext> _contextFactory;

    public OrderService(IDbContextFactory<ApplicationDbContext> contextFactory)
    {
        _contextFactory = contextFactory;
    }
    public Order GetById(int id)
    {
        using var context = _contextFactory.CreateDbContext();
        return context.Orders.Include(o => o.Lines).ThenInclude(o => o.Product).Where(o => o.OrderId == id).FirstOrDefault();
    }
}

这意味着您不能只是将对象从

GetById
传递到组件,让用户通过组件进行编辑,然后重新附加 (
ctx.Attach(order)
) 并保存,因为不会将任何内容标记为已修改。 使用
ctx.Update(order)
,然后保存,将重新保存该实体中的所有内容,订单中可能会有 100 行项目,这些项目将不必要地保存到数据库中。

是否有已知的彭定康可以提供处理此问题的最佳方法?

例如

我考虑过将返回的实体附加到新的 DBContext,但从未使用该上下文查询或保存到数据库。我希望它不会打开数据库连接,因此不需要显式处置。

然后我可以查询 DBContext

ChangeTracking
来获取更改,它们将更改传递给正确的更新、添加、删除短期数据库上下文。

或者更好的是,仅使用 EF core 的更改跟踪功能,而不使用数据库上下文?

c# entity-framework-core blazor
1个回答
0
投票

我认为你可能会比你需要的更多地将其分开。我建议处理此问题的方法是使用更新方法,在该方法中调用相同的代码来获取 GetById 方法中的值以获取实体,然后更新并将其保存在该方法中。像这样的东西-

public Order UpdateById(int id, Order newOrder)
    {
        using var context = _contextFactory.CreateDbContext();
        Order trackedOrder = context.Orders.Include(o => o.Lines).ThenInclude(o => o.Product).Where(o => o.OrderId == id).FirstOrDefault();

    }
© www.soinside.com 2019 - 2024. All rights reserved.