9

我正在使用实体框架进行 2 个查询,一个接一个,第一个总是工作正常,但第二个总是返回我:ConnectionString 属性尚未初始化。

如果我改变方法的顺序,同样的事情会发生,第一个工作正常,第二个抛出这个异常。

我在页面中使用的代码如下:

>  var count = RequestBaseBL.GetGenericResultsCount(query.QuerySql);    
> 
>                     var datatable = RequestBaseBL.GetGenericResults(query.QuerySql, 0);

在我的 DAL 中

public int  GetGenericResultsCount(string strsql)
            {
                using (var connection = (SqlConnection)_context.Database.Connection)
                {
                    var adapter = new SqlDataAdapter(strsql, connection);
                    var results = new DataSet();
                    adapter.Fill(results, "Results");
                    return results.Tables["Results"].Rows.Count;
                }
            }


        public DataTable GetGenericResults(string strsql, int pageIndex)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("WITH MyPagedData as ( ");
                int indexFrom = strsql.IndexOf("from");
                sb.Append(strsql.Substring(0, indexFrom));
                sb.Append(", ");
                sb.Append("ROW_NUMBER() OVER(ORDER BY RequestBaseId DESC) as RowNum ");
                sb.Append(strsql.Substring(indexFrom));
                sb.Append(") ");
                sb.Append("SELECT * from MyPagedData where RowNum between @StartIndex and @StartIndex + 10");


                using(var connection = (SqlConnection)_context.Database.Connection)
                {
                    var adapter = new SqlDataAdapter(sb.ToString(), connection);
                    adapter.SelectCommand.Parameters.Add("@StartIndex", SqlDbType.Int).Value = pageIndex;
                    var results = new DataSet();
                    adapter.Fill(results, "Results");
                    return results.Tables["Results"];
                }
            }
4

1 回答 1

21

通常,当您使用运算符或通过工厂方法using创建分配给变量的对象时,应使用该构造。innewConnection属性仅在连接不存在时才创建连接;在所有其他情况下,该属性只返回一个现有的。DatabaseDbContext

在您的代码中,第一次调用获得一个“实时”连接,对其进行操作,然后通过Dispose隐式执行的调用关闭它using。此时,DatabaseofDbContext具有对已释放对象的引用。第二次调用拾取该释放的对象,并尝试使用它,从而触发错误。

要解决此问题,只需替换using为分配:

var connection = (SqlConnection)_context.Database.Connection;
于 2012-06-06T09:49:38.743 回答