在存储库中,我正在执行以下两个连续任务:
// Update vendorOrder
vendorOrder.VendorOrderStatus = VendorOrderStatus.Completed;
vendorOrderRepository.UpdateVendorOrder(vendorOrder);
vendorOrderRepository.Save();
// Update order
order.OrderStatus = OrderStatus.Completed;
orderRepository.UpdateOrder(order);
orderRepository.Save();
vendorOrderRepository
和orderRepositoryrepositorty
都有自己的Save()
方法:
public void Save()
{
context.SaveChanges();
}
将在每个存储库中调用Save()
,仅保存对
那里的上下文,否则它将保存对上下文所做的每一个更改
到那个时候在其他任何存储库中?
在我的示例中,两次调用Save()
是否多余?如果我最后只打Save()
会起作用吗?
(我可以尝试一下自己,看看有什么用,但是如果有例外,我想根据MVC的工作方式给出一个明确的答案。这可能是对MVC的基本理解,但是我跳过了这一部分。 )
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);
}
答案 0 :(得分:1)
我需要多久保存一次上下文?
这样做通常是有意义的。通常,您只需要调用一次SaveChanges,除非处理大型集,否则在这种情况下使用事务并批量保存是有意义的。
在每个存储库中调用Save()只会在其中保存对上下文的更改,还是会保存对存储库所做的所有更改?
“那里的上下文”有点模糊。调用SaveChanges将保存在上下文中进行的所有所有更改。因此,如果vendorOrderRepository
和orderRepository
共享相同的上下文,则一次调用将保存所做的所有更改。
在我的示例中,两次调用Save()是否多余?如果我只是在最后调用Save()会起作用吗?
如果它们使用相同的上下文,则为是。如果不同,则不是多余的。
从广义上讲,SaveChanges的工作方式是它将保存存储在变更跟踪器中的实体(有关扩展的详细信息,请参见ChangeTracker Class MDN)。变更跟踪器(可通过context.ChangeTracker
访问)拥有一组跟踪的实体。这些将是在SaveChanges期间更新的实体,从技术上讲,这些实体称为“附加”。
您可以通过迭代context.ChangeTracker.Entries<T>()
来查看按类型附加的实体列表,其中T
是您的类型。
答案 1 :(得分:-1)
这取决于您使用哪种设计模式。如果使用的是存储库模式,则上下文在所有存储库之间共享,并且相同的上下文跟踪所有实体中的更改。因此,如果您一次调用Save()0r context.SaveChanges()就可以了。