Linq to SQL NullReferenceException:大海捞针中的随机针!

时间:2010-04-13 22:26:55

标签: linq-to-sql nullreferenceexception

我在我的应用程序中看似随机的NullReferenceExeceptions,并且无法追踪可能导致错误的原因。

我会尽力描述场景和设置。

非常感谢任何和所有建议!

  • C#.net 3.5 Forms Application,但我使用Phil Haack(http://haacked.com/archive/2008/03/11/using-routing-with-webforms.aspx)构建的WebFormRouting库来利用.net的路由库(通常与MVC一起使用) - 使用的内容url重写我的网址。

  • 我的数据库有60个表。全部归一化。这只是一个庞大的应用程序。 (SQL server 2008)

  • 所有查询都是在代码中使用Linq to SQL构建的(没有SP)。每次创建我的数据上下文的新实例。我只使用一个数据上下文,其中包含SQL Server中4个关系图中定义的所有关系。

  • 创建了很多数据上下文。我让自动处理数据上下文的关闭。我听说双方是否应该自动关闭或自己关闭。在这种情况下,我不要自己做。

  • 如果我正在创建大量数据上下文实例或只创建一个实例,那似乎无关紧要。

例如,我有一个投票按钮。使用以下代码,它可能在10-20次中出错。

protected void VoteUpLinkButton_Click(object sender, EventArgs e)
{
    DatabaseDataContext db = new DatabaseDataContext();

    StoryVote storyVote = new StoryVote();
    storyVote.StoryId = storyId;
    storyVote.UserId = Utility.GetUserId(Context);
    storyVote.IPAddress = Utility.GetUserIPAddress();
    storyVote.CreatedDate = DateTime.Now;
    storyVote.IsDeleted = false;

    db.StoryVotes.InsertOnSubmit(storyVote);
    db.SubmitChanges();

    // If this story is not yet published, check to see if we should publish it.  Make sure that
    // it is already approved.
    if (story.PublishedDate == null && story.ApprovedDate != null)
    {
        Utility.MakeUpcommingNewsPopular(storyId);
    }

    // Refresh our page.
    Response.Redirect("/news/" + category.UniqueName + "/"
        + RouteData.Values["year"].ToString() + "/"
        + RouteData.Values["month"].ToString() + "/"
        + RouteData.Values["day"].ToString() + "/"
        + RouteData.Values["uniquename"].ToString());
}

我尝试的最后一件事是SQL Server上的“自动关闭”标志设置。这被设置为true,我改为false。虽然总体效果很好,但似乎没有做到这一点。

这是一个没有抓到的详细信息。当我的try / catch's抓住时,我也会得到一些不同的错误。

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. --->
System.NullReferenceException: Object reference not set to an instance of an object. at
System.Web.Util.StringUtil.GetStringHashCode(String s) at
System.Web.UI.ClientScriptManager.EnsureEventValidationFieldLoaded() at
System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) at
System.Web.UI.WebControls.TextBox.LoadPostData(String postDataKey, NameValueCollection postCollection) at
System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) at
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) --- End of inner exception stack trace --- at
System.Web.UI.Page.HandleError(Exception e) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at
System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest() at
System.Web.UI.Page.ProcessRequest(HttpContext context) at
ASP.forms_news_detail_aspx.ProcessRequest(HttpContext context) at
System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

HELP !!!

2 个答案:

答案 0 :(得分:0)

从堆栈跟踪看起来与LINQ没什么关系。在Reflector中查看System.Web,似乎Page.RequestViewStateString以某种方式为空。我在调试器中确认异常发生时并尝试跟踪那里发生的事情(使用Reflector)。

答案 1 :(得分:0)

哦,男孩,手指交叉。

来到这里。 http://forums.asp.net/t/1170677.aspx

其中涉及设置:在页面中设置enableEventValidation =“false”或在所有页面的web.config中设置。

我宁愿不必这样做,从技术上来说它并没有“修复”错误,只是通过外观避免它。

在现场网站上,我现在很乐意使用绑带。

感谢Evgeny,你让我走上正轨。我想我错误地怀疑Linq to SQL,而且堆栈跟踪应该更明显。

不幸的是(或幸运的是),我正在尝试很多'新东西',所以还有很多尚未看到的错误。