我需要多久保存一次上下文?

时间:2018-08-22 19:32:15

标签: c# entity-framework

在存储库中,我正在执行以下两个连续任务:

// Update vendorOrder
vendorOrder.VendorOrderStatus = VendorOrderStatus.Completed;
vendorOrderRepository.UpdateVendorOrder(vendorOrder);
vendorOrderRepository.Save();
// Update order
order.OrderStatus = OrderStatus.Completed;
orderRepository.UpdateOrder(order);
orderRepository.Save();

vendorOrderRepositoryorderRepositoryrepositorty都有自己的Save()方法:

public void Save()
{
    context.SaveChanges();
}
  • 将在每个存储库中调用Save(),仅保存对 那里的上下文,否则它将保存对上下文所做的每一个更改 到那个时候在其他任何存储库中?

  • 在我的示例中,两次调用Save()是否多余?如果我最后只打Save()会起作用吗?

(我可以尝试一下自己,看看有什么用,但是如果有例外,我想根据MVC的工作方式给出一个明确的答案。这可能是对MVC的基本理解,但是我跳过了这一部分。 )

编辑1

vendorOrderRepository始于:

public class VendorOrderRepository : IVendorOrderRepository, IDisposable
{
    private ApplicationDbContext context = new ApplicationDbContext();
    private IOrderRepository orderRepository;
    public VendorOrderRepository(ApplicationDbContext context)
    {
        this.context = context;
        orderRepository = new OrderRepository(context);
    }

orderRepository始于:

public class OrderRepository : IOrderRepository, IDisposable
{
    private ApplicationDbContext context = new ApplicationDbContext();
    private IVendorOrderRepository vendorOrderRepository;
    public OrderRepository(ApplicationDbContext context)
    {
        this.context = context;
        vendorOrderRepository = new VendorOrderRepository(context);
    }

2 个答案:

答案 0 :(得分:1)

  

我需要多久保存一次上下文?

这样做通常是有意义的。通常,您只需要调用一次SaveChanges,除非处理大型集,否则在这种情况下使用事务并批量保存是有意义的。

  

在每个存储库中调用Save()只会在其中保存对上下文的更改,还是会保存对存储库所做的所有更改?

“那里的上下文”有点模糊。调用SaveChanges将保存在上下文中进行的所有所有更改。因此,如果vendorOrderRepositoryorderRepository共享相同的上下文,则一次调用将保存所做的所有更改。

  

在我的示例中,两次调用Save()是否多余?如果我只是在最后调用Save()会起作用吗?

如果它们使用相同的上下文,则为是。如果不同,则不是多余的。


从广义上讲,SaveChanges的工作方式是它将保存存储在变更跟踪器中的实体(有关扩展的详细信息,请参见ChangeTracker Class MDN)。变更跟踪器(可通过context.ChangeTracker访问)拥有一组跟踪的实体。这些将是在SaveChanges期间更新的实体,从技术上讲,这些实体称为“附加”。

您可以通过迭代context.ChangeTracker.Entries<T>()来查看按类型附加的实体列表,其中T是您的类型。

答案 1 :(得分:-1)

这取决于您使用哪种设计模式。如果使用的是存储库模式,则上下文在所有存储库之间共享,并且相同的上下文跟踪所有实体中的更改。因此,如果您一次调用Save()0r context.SaveChanges()就可以了。