我正在使用实体框架,偶尔我会得到这个错误.
EntityCommandExecutionException
{"There is already an open DataReader associated with this Command which must be closed first."}
at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands...
Run Code Online (Sandbox Code Playgroud)
即使我没有做任何手动连接管理.
这个错误间歇性地发生.
触发错误的代码(为了便于阅读而缩短):
if (critera.FromDate > x) {
t= _tEntitites.T.Where(predicate).ToList();
}
else {
t= new List<T>(_tEntitites.TA.Where(historicPredicate).ToList());
}
Run Code Online (Sandbox Code Playgroud)
使用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());
}
}
Run Code Online (Sandbox Code Playgroud)
仍有问题
如果连接已经打开,EF为什么不重用连接?
我有以下这段代码:
public TimestampedRowStorage GetTimestampedRowStorage(string startTime, string endTime, long trendSettingID, int? period)
{
var timestampedList = (from t in dataContext.TrendRecords
where t.TrendSetting_ID == trendSettingID
select t).ToList();
return new TimestampedRowStorage
{
TimestampedDictionary = timestampedList.ToDictionary(m => m.Timestamp,
m => (from j in dataContext.TrendSignalRecords
where j.TrendRecord_ID == m.ID
select j).ToDictionary(p => p.TrendSignalSetting.Name,
p => (double?)p.Value))
};
}
Run Code Online (Sandbox Code Playgroud)
但我总是得到以下例外:
已经有一个与此Connection关联的开放DataReader,必须先关闭它.
这是堆栈跟踪:
[MySqlException(0x80004005):已经有一个与此Connection关联的打开DataReader,必须先关闭它.]
MySql.Data.MySqlClient.MySqlCommand.CheckState()+237 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)+ 146
MySql.Data.Entity.EFMySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)+47
System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)+10
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior behavior)+443[EntityCommandExecutionException:执行命令定义时发生错误.有关详细信息,请参阅内部异常.]
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior behavior)+479
System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute(ObjectContext context,ObjectParameterCollection parameterValues)+736
System.Data. Objects.ObjectQuery1.GetResults(Nullable1 forMergeOption)+149 …
我正在使用sql连接访问我的数据库中的不同表.但是代码返回以下错误.
错误:"已经有一个与此命令关联的打开的DataReader必须先关闭":
MyContext conn = new MyContext()
protected void ChangeName(int id)
{
User user = conn.MyOtherTable.First(x => x.id == id);
var elements = conn.MyTable.Where(x => x.id == id && x.name == name).OrderBy(x => x.id).OrderBy(x => x.name).
.Select(t => new { t.id, t.name, }).GroupBy(t => new { t.id, t.name, });
foreach (var item in elements)
{
foreach (var row in item)
{
for (int j = 1; j <= 5; j++)
{
if (row.name == "name")
{
user.name1 = …Run Code Online (Sandbox Code Playgroud)