Tôi đang sử dụng Entity Framework và thỉnh thoảng tôi sẽ gặp lỗi này.
EntityCommandExecutionException
{"There is already an open DataReader associated with this Command which must be closed first."}
at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands...
Mặc dù tôi không làm bất kỳ quản lý kết nối thủ công.
lỗi này xảy ra không liên tục.
mã gây ra lỗi (rút ngắn để dễ đọc):
if (critera.FromDate > x) {
t= _tEntitites.T.Where(predicate).ToList();
}
else {
t= new List<T>(_tEntitites.TA.Where(historicPredicate).ToList());
}
sử dụng mẫu Vứt bỏ để mở kết nối mới mỗi lần.
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());
}
}
vẫn có vấn đề
tại sao EF không sử dụng lại kết nối nếu nó đã mở.
predicate
vàhistoricPredicate
biến của bạn là gì. Tôi đã phát hiện ra rằng nếu bạn vượt quaFunc<T, bool>
đểWhere()
nó sẽ biên dịch và đôi khi làm việc (vì nó không được "ở đâu" trong bộ nhớ). Những gì bạn nên làm là chuyểnExpression<Func<T, bool>>
đếnWhere()
.