ฉันใช้ 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());
}
ใช้รูปแบบการกำจัดเพื่อเปิดการเชื่อมต่อใหม่ทุกครั้ง
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()