相关疑难解决方法(0)

实体框架:已经有一个与此命令关联的开放DataReader

我正在使用实体框架,偶尔我会得到这个错误.

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为什么不重用连接?

linq entity-framework sql-server-2008

279
推荐指数
6
解决办法
15万
查看次数

如何避免"已经有一个与此Connection相关联的打开的DataReader必须先关闭." 在MySql/net连接器?

我有以下这段代码:

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.ObjectQuery 1.GetResults(Nullable1 forMergeOption)+149 …

c# mysql-connector linq-to-sql asp.net-mvc-3

5
推荐指数
3
解决办法
2万
查看次数

错误:已经有一个与此命令关联的打开DataReader,必须先关闭它

我正在使用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)

c# sql asp.net

3
推荐指数
1
解决办法
3220
查看次数