2011-04-20 66 views
0

叫我用EF 4.0和它的作品真的很好,当异常,但问题发生时 我打电话查询:LINQ到实体,ToList()从非UI线程


var query = from employee in employees from cr in employee.RcpCrossRegister select new { employee, cr } 然后当我打电话

var list = query.ToList() 

我得到异常

Collection was modified; enumeration operation may not execute 
and call stack: 

     w System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource) 
    w System.Collections.Generic.List`1.Enumerator.MoveNextRare() 
    w System.Collections.Generic.List`1.Enumerator.MoveNext() 
    w System.Data.Objects.DataClasses.EntityCollection`1.CheckIfNavigationPropertyContainsEntity(IEntityWrapper wrapper) 
    w System.Data.Objects.DataClasses.RelatedEnd.Add(IEntityWrapper wrappedTarget, Boolean applyConstraints, Boolean addRelationshipAsUnchanged, Boolean relationshipAlreadyExists, Boolean allowModifyingOtherEndOfRelationship, Boolean forceForeignKeyChanges) 
    w System.Data.Objects.DataClasses.RelatedEnd.Add(IEntityWrapper wrappedEntity, Boolean applyConstraints) 
    w System.Data.Objects.DataClasses.EntityReference`1.set_ReferenceValue(IEntityWrapper value) 
    w System.Data.Objects.DataClasses.EntityReference.SetEntityKey(EntityKey value, Boolean forceFixup) 
    w System.Data.Objects.EntityEntry.FixupEntityReferenceToPrincipal(EntityReference relatedEnd, EntityKey foreignKey, Boolean setIsLoaded, Boolean replaceExistingRef) 
    w System.Data.Objects.EntityEntry.FixupReferencesByForeignKeys(Boolean replaceAddedRefs) 
    w System.Data.Objects.ObjectStateManager.FixupReferencesByForeignKeys(EntityEntry newEntry, Boolean replaceAddedRefs) 
    w System.Data.Objects.ObjectStateManager.AddEntry(IEntityWrapper wrappedObject, EntityKey passedKey, EntitySet entitySet, String argumentName, Boolean isAdded) 
    w System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet) 
    w lambda_method(Closure , Shaper) 
    w System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper) 
    w System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext() 
    w TCS.bos.Infrastructure.Data.MainModule.Repositories.EmployeeRepository.GetEmployeesEvacuationTimeSheet(Int64 dateHour) 
    w TCS.bos.Domain.MainModule.Employees.EmployeeTimeSheetService.GetEmployeesEvacuationTimeSheet(Int64 dateHour) 
    w TCS.plg.TimeSheets.ViewModels.TimeSheetsGridViewModel.GetAll2() 
    w TCS.plg.TimeSheets.ViewModels.TimeSheetsGridViewModel.<>c__DisplayClass4.<FilterCommand>b__2() 
    w TCS.Core.Caliburn.Invocation.BackgroundTask.<>c__DisplayClassd.<.ctor>b__4(Object s, DoWorkEventArgs e) w D:\VS2010\CaliburnMicro\caliburnmicro_a63379fba70a\TCS.2.3\TCS.Core\Caliburn\Invocation\BackgroundTask.cs:wiersz 41 
    w System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e) 
    w System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument) 
+0

你在创建查询和枚举它之间做了什么?这是推迟的,所以你以前做的任何事情都不会发生,直到你试图枚举。 – 2011-04-20 08:28:50

+0

你是对的,但这正是我使用的代码... – Robertok 2011-04-20 08:34:17

回答

0

Entity Framework不是线程安全的,只能在创建它的线程上使用ObjectContext

+0

...重要提示:此异常仅在从非UI线程调用时才会发生......我怀疑 “关系修复”使得一些工作收集和引起异常,但不知道 如何解决它... ---------- 我没有任何问题,当我从UI线程调用它,但我需要显示进度栏在UI线程上...... – Robertok 2011-04-20 08:31:33

+0

它可以在UI线程上工作,因为你可能在UI线程上创建了ObjectContext ... – 2011-04-20 08:32:53

+1

@Thomas Levesque:“不是线程安全的”不等于“只能在线程上使用创造它“。你能看到区别么? – 2011-04-20 08:59:51