我有一个场景,我需要将Web服务返回的大图(超过2000个实体)合并到现有的DbContext中。所以,我的第一次尝试:
' get new object from web service
Dim newCust = DAL.GetCustomer(ActiveCustomerView.CustomerID)
' attach the object graph into existing context
context.Customers.Attach(newCust)
如果我尝试附加包含上下文中已存在的实体的对象,则会产生重复冲突。
为了避免这个问题,我正在清除本地数据,然后在附加之前调用AcceptAllChanges:
context.Orders.Local.Clear()
context.OrderItems.Local.Clear()
context.Messages.Local.Clear()
context.Contacts.Local.Clear()
context.Parcels.Local.Clear()
context.CustomerTransactions.Local.Clear()
context.ReturnedParcels.Local.Clear()
context.ReturnedOrderItems.Local.Clear()
context.InventoryItems.Local.Clear()
context.Shippments.Local.Clear()
context.Prints.Local.Clear()
DirectCast(context, IObjectContextAdapter).ObjectContext().AcceptAllChanges()
这样可行,但性能不可接受,因为清除数据需要40秒。
有没有其他方法可以有效地实现这一目标? 我可以以某种方式处理DbSet清除它们的状态吗?
每次我需要附加图形时,我都无法销毁和创建新的上下文,因为它包含其他可能丢失的对象。