컴파일 된 쿼리를 사용하여 컴파일 된 쿼리를 Func <> 뒤에 추상화하는 응용 프로그램에서 쿼리 논리의 일부를 수행하는 작업이 매우 복잡합니다. 나는 정기적으로 다음과 같은 예외를 수신 (한때 천 또는 실행에) 있어요 :EF 때때로 SqlException이 발생하는 컴파일 된 쿼리
SqlException:
The parameterized query '(@p__linq__0 int,@p__linq__1 nvarchar(4000),@p__linq__2 varchar(' expects the parameter '@p__linq__1', which was not supplied.
And InvalidOperationException:
Parameters cannot be added or removed from the parameter collection, and the parameter collection cannot be cleared after a query has been evaluated or its trace string has been retrieved.
내 첫 반응은, 두 번째 예외를보고 난 후에, 나는 동시성 문제에 부딪 치는거야 것입니다. 이것은 서비스 동작에 대한 기본 구성에서 basicHttpBinding을 사용하는 WCF 서비스에서 수행됩니다. 이는 동시성 모드가 단일이라는 것을 의미합니다. 나는 InstanceContextMode single을 사용하지 않고 대신 디폴트 PerSession을 사용하여 잠재적으로이 문제를 일으킬 수 있습니까?
관련된 데이터베이스가 많이 사용되기 때문에 쿼리 중에 시간이 초과 된 것으로 의심되었지만 지금보고있는 예외와 논리적 인 상관 관계를 그릴 수는 없습니다.
문제를 추가하려면 로컬 컴퓨터에서 이러한 오류를 재현 할 수 없습니다. 예외는 저녁 동안 원격 서버의 처리 루틴 동안 발생하며 밤에는 한두 번만 발생합니다. 바라건대 다른 누군가가 비슷한 것을 경험했기를 바랍니다. instancecontextmode 변경, 증가 된 SQL Server 시간 초과 추가 등 몇 가지 시도를 할 수 있지만 해결 방법을 시도하기 전에 문제가 무엇인지 알고 싶습니다.
System.Data.Objects.ObjectParameterCollection.Add(ObjectParameter parameter)
System.Data.Objects.ELinq.CompiledELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
System.Linq.Enumerable.Count[TSource](IEnumerable`1 source, Func`2 predicate)
Processor.Processor.<>c__DisplayClass10.<GetObjectContexts>b__9(ObjectContextMetadata q) in C:\Documents and Settings\eugarps\My Documents\SomeService-development\Processor\Processor.cs:line 174
System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
System.Linq.Enumerable.<DistinctIterator>d__81`1.MoveNext()
System.Linq.Enumerable.Contains[TSource](IEnumerable`1 source, TSource value, IEqualityComparer`1 comparer)
Processor.Processor.<>c__DisplayClass10.<GetObjectContexts>b__c(ObjectContextMetadata q) in C:\Documents and Settings\eugarps\My Documents\SomeService-development\Processor\Processor.cs:line 179
System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
Processor.Processor.ResolveGeoCode(AddressItem address, String product) in C:\Documents and Settings\eugarps\My Documents\SomeService-development\Processor\Processor.cs:line 273
Company.ProcessingLogic.SomeService.SomeServiceService.ResolveDepotWithMask(AddressItem address, String product, DeliveryMap map, IGeocoder geocoder) in C:\Documents and Settings\eugarps\My Documents\SomeService-development\SomeServiceService\SomeServiceService.cs:line 136
Company.ProcessingLogic.SomeService.SomeServiceService.ResolveDepotWithMask(AddressItem address, String product, DeliveryMap map) in C:\Documents and Settings\eugarps\My Documents\SomeService-development\SomeServiceService\SomeServiceService.cs:line 59
Company.ProcessingLogic.SomeService.SomeServiceService.ResolveDepot(AddressItem address, String product) in C:\Documents and Settings\eugarps\My Documents\SomeService-development\SomeServiceService\SomeServiceService.cs:line 53
SyncInvokeResolveDepot(Object , Object[] , Object[])
System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
감사합니다. 유망한 것으로 보입니다. 다음에 내가 사무실에있을 때 이것이 의미가 있는지 알 수 있습니다. 그러나 동일한 입력은 때때로 오류를 유발하지만 다른 오류는 발생시키지 않습니다. 이는 부분적으로 동시성을 고려한 이유입니다. – Sprague
나는 이것이 문제가 아니라는 것을 조사한 후 꽤 확신한다. 그러나 아직 해결되지 않았습니다. 이 문제를 해결할 때까지 컴파일 된 쿼리를 사용하는 대신 저장된 proc을 구현할 것입니다. – Sprague