मैं एंटिटी फ्रेमवर्क का उपयोग कर रहा हूं और कभी-कभी मुझे यह त्रुटि मिलेगी।
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()
।