通过Session传递LinqDataSource:'在Dispose之后访问DataContext'。

时间:2009-01-19 15:18:35

标签: asp.net session linqdatasource

我需要从数据库中传递一些结果。我尝试传递一个LinqDataSource配置对象,而不是传递整个数据集或构造的SQL查询。

在源页面上,我使用用户在页面上显示的控件上设置的值配置LinqDataSource对象属性其中 WhereParameters (搜索框,组合盒子等)。我传递了对象以避免在接收器页面上重新配置LinqDataSource。

但是,即使它在我的开发系统上工作正常,在将其部署到专用服务器上后,我收到了一条错误消息:

  

无法访问已处置的对象。

     

对象名:'Dispose后访问的DataContext。'。

在两个页面上,源和接收器,LinqDataSource对象声明为:

<asp:LinqDataSource ID="myLinqDS" runat="server" 
    ContextTypeName="MyProject.MyDBNamedpace.MyDataContext" 
    TableName="TheTable"
    OrderBy="field1, field2"
</asp:LinqDataSource>

要传递数据源对象,请执行以下操作:

SetLinqDataSourceWhereAndHisParameters(); //just set Where and WhereParameters
Guid guid = Guid.NewGuid();
Session[guid.ToString()] = myLinqDS;
ScriptManager.RegisterStartupScript(this.Page,
    typeof(Page),
    "Redirect",
    String.Format(@"window.open(""{0}"");",
        this.ResolveClientUrl("~/PageToDisplayTheData.aspx?guid=" +
        System.Web.HttpUtility.UrlEncode(guid.ToString())
    ),
true);

并在PageToDisplayTheData.aspx的代码隐藏中检索:

myLinqDS =
   (LinqDataSource)Session[System.Web.HttpUtility.UrlDecode(Request.QueryString[guid])];
aDataList.DataSource = myLinqDS;
aDataList.DataBind();

3 个答案:

答案 0 :(得分:2)

您应该将DataContext存储在Session(或任何地方),原因如下:

  • DataContext不是线程安全的
  • DataContext被设计为工作单元工具

如果在DataContext中查询集合,则它在内部进行缓存,因此当您重新查询它时,不会对数据库进行往返。但这可能会导致数据停滞,因为这些值并不反映底层数据库的实际状态。

答案 1 :(得分:0)

你的目标是什么?如果您希望让应用程序不必返回数据库,那么无论如何您都需要缓存整个数据集。如果您只是不必重新创建查询,为什么不将查询作为方法添加到数据上下文中,并从那里随处引用它。

public partial class MyDataContext
{
    public Table<MyTable> OrderedTable()
    {
         return this.TheTable.OrderBy( t => t.field1 )
                             .ThenBy( t => t.field2 );
    }
}

答案 2 :(得分:0)

只是将属性从一个对象复制到另一个对象并且有效:

LinqDataSource received=
(LinqDataSource)Session[System.Web.HttpUtility.UrlDecode(Request.QueryString[guid])];

myLinqDS.Where = received.Where;
foreach (Parameter p in received.WhereParameters)
    myLinqDS.WhereParameters.Add(p);

但是我仍然不知道为什么它在VS2008内部网络服务器上有效,但在主服务器上没有,运行IIS。