LINQ DataContext会导致麻烦

时间:2013-03-13 19:10:05

标签: c# asp.net linq linq-to-sql

我有一个全局datacontext,我更新了每个请求:

    protected void Page_Load(object sender, EventArgs e)
    {

        Response.ContentType = "application/json";
        Response.Write(GetResponse());
        Response.End();
    }


    public string GetResponse()
    {
        string fileName = this.Page.Request.PathInfo;
        fileName = fileName.Remove(0, fileName.LastIndexOf("/") + 1);

        DataContext.Renew();
        MethodInfo method = this.GetType().GetMethod(fileName);
        if (method == null)
            throw new InvalidOperationException(
                string.Format("Unknown method {0}.", fileName));
        return (string)method.Invoke(this, new object[0]);
    }

但无论出于何种原因,通常当我收到多个请求时(比如多个ajax调用),我会收到类似的错误:

   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Data.Linq.DataContext.GetTable(MetaTable metaTable)
   at System.Data.Linq.DataContext.GetTable[TEntity]()
   at LibKezberProjectManager.KezberPMDBDataContext.get_Cases() in c:\Users\jlarouche\Documents\Visual Studio 2012\Projects\KezberProjectManager\LibKezberProjectManager\KezberPMDB.designer.cs:line 204
   at LibKezberProjectManager.Data.Cases.GetAllScheduled() in c:\Users\jlarouche\Documents\Visual Studio 2012\Projects\KezberProjectManager\LibKezberProjectManager\Data.cs:line 113
   at LibKezberProjectManager.Logic.ScheduleManager.GetScheduledCases() in c:\Users\jlarouche\Documents\Visual Studio 2012\Projects\KezberProjectManager\LibKezberProjectManager\Logic.cs:line 1035
   at KezberProjectManager.CalendarServices.GetDates() in c:\Users\jlarouche\Documents\Visual Studio 2012\Projects\KezberProjectManager\KezberProjectManager\CalendarServices.aspx.cs:line 628

我更新每个请求的上下文,但它仅用于该请求。我做错了吗?

DataContext.Renew()调用db = new KezDBContext();

所有电话都使用此功能。

我的所有访问器方法都是静态的这个事实是一个问题吗?我不这么认为。

由于

1 个答案:

答案 0 :(得分:3)

您没有为DataContext提供代码,但我认为它被声明为静态字段/属性。这是一个非常大的问题,因为DataContext不是线程安全的,但ASP.NET中的每个并发请求都是在一个单独的线程上提供的。您需要为每个请求创建一个DataContext。这可以通过多种方式实现,最简单的(但不一定是最易维护的)可能是通过创建从System.Web.UI.Page派生的基类来将DataContext与Page对象相关联,从中依次对所有页面进行处理的。