У меня есть сценарий, в котором мне нужно объединить большой граф (более 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 для их очистки?
Я не могу уничтожать и создавать новый контекст каждый раз, когда мне нужно прикрепить график, потому что он содержит другие объекты, которые могут быть потеряны.