Entity Framework를 사용하고 있으며 때때로이 오류가 발생합니다.
EntityCommandExecutionException
{"There is already an open DataReader associated with this Command which must be closed first."}
at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands...
수동 연결 관리를 수행하지 않더라도.
이 오류는 간헐적으로 발생합니다.
오류를 유발하는 코드 (쉽게 읽기 위해 단축) :
if (critera.FromDate > x) {
t= _tEntitites.T.Where(predicate).ToList();
}
else {
t= new List<T>(_tEntitites.TA.Where(historicPredicate).ToList());
}
매번 새로운 연결을 열기 위해 Dispose 패턴을 사용합니다.
using (_tEntitites = new TEntities(GetEntityConnection())) {
if (critera.FromDate > x) {
t= _tEntitites.T.Where(predicate).ToList();
}
else {
t= new List<T>(_tEntitites.TA.Where(historicPredicate).ToList());
}
}
여전히 문제가있다
연결이 이미 열려있는 경우 EF가 연결을 재사용하지 않는 이유는 무엇입니까?
predicate
과historicPredicate
변수가 어떤 유형인지 알고 싶습니다 . 난 당신이 통과하면 것을 발견했습니다Func<T, bool>
에Where()
(그것을 않기 때문에 "여기서"메모리에) 가끔 작업을 컴파일합니다. 당신이 해야 일을 할 것은 통과Expression<Func<T, bool>>
에Where()
.