ObjectStateManager не содержит ObjectStateEntry со ссылкой на объект типа X - PullRequest
0 голосов
/ 24 сентября 2019

Мне нужно асинхронно загрузить несколько коллекций предметов из БД.Если я инкапсулирую запрос в Task.Run (), я получаю это исключение.

System.InvalidOperationException: 'The ObjectStateManager does not contain an ObjectStateEntry with a reference to an object of type 
-----
en System.Data.Entity.Core.Objects.ObjectStateManager.GetEntityEntry(Object entity)
   en System.Data.Entity.Core.Objects.DataClasses.EntityReference`1.ClearCollectionOrRef(IEntityWrapper wrappedEntity, RelationshipNavigation navigation, Boolean doCascadeDelete)
   en System.Data.Entity.Core.Objects.DataClasses.EntityReference`1.AddToLocalCache(IEntityWrapper wrappedEntity, Boolean applyConstraints)
   en System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.Add(IEntityWrapper wrappedTarget, Boolean applyConstraints, Boolean addRelationshipAsUnchanged, Boolean relationshipAlreadyExists, Boolean allowModifyingOtherEndOfRelationship, Boolean forceForeignKeyChanges)
   en System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.Add(IEntityWrapper wrappedEntity, Boolean applyConstraints)
   en System.Data.Entity.Core.Objects.DataClasses.EntityReference`1.set_ReferenceValue(IEntityWrapper value)
   en System.Data.Entity.Core.Objects.DataClasses.EntityReference.SetEntityKey(EntityKey value, Boolean forceFixup)
   en System.Data.Entity.Core.Objects.EntityEntry.FixupEntityReferenceToPrincipal(EntityReference relatedEnd, EntityKey foreignKey, Boolean setIsLoaded, Boolean replaceExistingRef)
   en System.Data.Entity.Core.Objects.EntityEntry.FixupReferencesByForeignKeys(Boolean replaceAddedRefs, EntitySetBase restrictTo)
   en System.Data.Entity.Core.Objects.ObjectStateManager.FixupReferencesByForeignKeys(EntityEntry newEntry, Boolean replaceAddedRefs)
   en System.Data.Entity.Core.Objects.ObjectStateManager.AddEntry(IEntityWrapper wrappedObject, EntityKey passedKey, EntitySet entitySet, String argumentName, Boolean isAdded)
   en System.Data.Entity.Core.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
   en lambda_method(Closure , Shaper )
   en System.Data.Entity.Core.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
   en System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
   en System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
   en System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   en System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   en AMC.OM.App.Views.Logistica.EntradaMercancia.PopUpCrearIncidencia.PopUpCrearIncidenciaViewModel.<SetViewModelPropertiesAsync>b__62_1() en D:\Proyectos .NET\AMC\OperationManager\Code\App\AMC.OM.App\Views\Logistica\EntradaMercancia\PopUpCrearIncidencia\PopUpCrearIncidenciaViewModel.cs:línea 247

Это не прерывает выполнение при загрузке данных.Просто когда я звоню await.Но исключение выдается много раз

Я проверил запросы к нему синхронно, и он работает, но окно загружается + 40 с.Очевидно, это потому, что EF загружает ленивые элементы синхронно, поэтому возможно, что ленивые отношения загружаются раньше самого родителя ...

/*
This throws the exceptions
*/
FillList = new Task[2];
FillList[(int)Tasks.PedidoCompra] = Task.Run(() =>
{
     PedidosCompra = new ObservableCollection<WM_Pedido_Proveedor>(Context.WM_Pedido_Proveedor.Where(x => x.CompanyId == cId).ToList());
});
FillList[(int)Tasks.Lote] = Task.Run(() =>
{
     Lotes = new ObservableCollection<WM_Lote>(Context.WM_Lote.Where(x => x.CompanyId == cId).ToList());
});

//... When the user press the button using that collection
var listTask = FillList[(int)Tasks.PedidoCompra];
if (!listTask.IsCompleted)
     await listTask;

/*
This works (the window takes +40s to load)
*/
PedidosCompra = new ObservableCollection<WM_Pedido_Proveedor>(Context.WM_Pedido_Proveedor.Where(x => x.CompanyId == cId).ToList());
Lotes = new ObservableCollection<WM_Lote>(Context.WM_Lote.Where(x => x.CompanyId == cId).ToList());
//...

Я хотел загрузить данныеАсинхронно и заморозить приложение только тогда, когда пользователь нуждается в данных и еще не загружен, но, очевидно, он загружает ленивые отношения перед родительским элементом и не может правильно отобразить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...