У меня есть процесс, в котором я читаю тысячи записей из базы данных, кодирую каждую из них в отдельное сообщение XML и отправляю упомянутое сообщение службе WCF.
На базу данных ссылается модель EF4,Я использую TPL для распараллеливания создания сообщений XML.Проблема возникает с самым первым запросом LINQ:
var practice = (from patient in db.T_AccountHolder
join practitioner in db.T_Practitioner on patient.DefaultPractitioner_ID equals practitioner.Practitioner_ID
join _practice in db.T_Practice on practitioner.Practice_ID equals _practice.Practice_ID
where patient.AccountHolder_ID == accountholder_id
select _practice).FirstOrDefault();
Я получаю следующее исключение:
ArgumentException: An item with the same key has already been added.
После многих исследований я обнаружил, что EF не назначает новый ключаналогично запрашиваемым результатам, что означает, что если вы запрашиваете одну и ту же таблицу с тем же результатом, произойдет указанное выше исключение (поскольку результат находится в том же текстовом тексте).
Поскольку я использую TPL, яв этой конкретной ситуации.Является ли мое единственное средство НЕ использовать EF?Вернуться к обычным запросам ADO.NET?
Я искал вверх и вниз по этому отличному сайту и Google, но, похоже, не нашел подобного типа вопросов.
РЕДАКТИРОВАТЬ: Вот трассировка стека ошибки.
Exception message: An item with the same key has already been added.
at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
at System.Data.Objects.ObjectStateManager.AddStateManagerTypeMetadata(EntitySet entitySet, ObjectTypeMapping mapping)
at System.Data.Objects.ObjectStateManager.GetOrAddStateManagerTypeMetadata(Type entityType, EntitySet entitySet)
at System.Data.Objects.ObjectStateManager.AddEntry(IEntityWrapper wrappedObject, EntityKey passedKey, EntitySet entitySet, String argumentName, Boolean isAdded)
at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
at System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__1[TResult](IEnumerable`1 sequence)
at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot)
at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression)
at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)
at WCFServiceTest.Messages.CreateAccountHolderMessage(Int32 accountholder_id) in C:\Users\Chris\documents\visual studio 2010\Projects\WCFServiceTest\WCFServiceTest\Messages.cs:line 116
at WCFServiceTest.Messages.CreateParallelMessagesForAccountHolder(Int32 accountholder_id, manmayEntities _db, List`1 queue) in C:\Users\Chris\documents\visual studio 2010\Projects\WCFServiceTest\WCFServiceTest\Messages.cs:line 2482
at WCFServiceTest.ParallelWork.<>c__DisplayClass22.<ProcessData_EF>b__1f(Int32 patient_id) in C:\Users\Chris\documents\visual studio 2010\Projects\WCFServiceTest\WCFServiceTest\ParallelWork.cs:line 298