Мне нужно асинхронно загрузить несколько коллекций предметов из БД.Если я инкапсулирую запрос в 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());
//...
Я хотел загрузить данныеАсинхронно и заморозить приложение только тогда, когда пользователь нуждается в данных и еще не загружен, но, очевидно, он загружает ленивые отношения перед родительским элементом и не может правильно отобразить его.