Linq to SQL NullReferenceException: случайная стрелка в стоге сена! - PullRequest
1 голос
/ 14 апреля 2010

Я получаю исключения NullReferenceExeceptions в кажущемся случайном времени в моем приложении и не могу отследить, что может быть причиной ошибки.

Я приложу все усилия, чтобы описать сценарий и настройку.

Любые предложения приветствуются!

  • C # .net 3.5 Forms Application, но я использую библиотеку WebFormRouting, созданную Филом Хааком (http://haacked.com/archive/2008/03/11/using-routing-with-webforms.aspx), для использования библиотек маршрутизации .net (обычно используется в сочетании с MVC) - использование переписывание URL для моих URL.

  • В моей базе 60 таблиц. Все нормализовано. Это просто масштабное приложение. (SQL Server 2008)

  • Все запросы построены с использованием Linq to SQL в коде (без SP). Каждый раз, когда создается новый экземпляр моего контекста данных. Я использую только один контекст данных со всеми отношениями, определенными в 4 диаграммах отношений в SQL Server.

  • контекст данных создается много. Я позволил закрытию контекста данных обрабатываться автоматически. Я слышал аргументы обеих сторон о том, следует ли вам автоматически закрыться или сделать это самостоятельно. В этом случае я не делаю это сам.

  • Кажется, не имеет значения, создаю ли я много экземпляров контекста данных или только один.

Например, у меня есть кнопка голосования. со следующим кодом, и это, вероятно, ошибки 1 в 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. Кажется, не справился, хотя и имел хороший общий эффект.

Вот подробное описание, которое не было поймано. Я также получаю немного другие ошибки, когда ловлюсь на моих попытках / ловушках.

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 голосов
/ 14 апреля 2010

о, мальчик, скрестив пальцы.

натолкнулся на это.http://forums.asp.net/t/1170677.aspx

, где говорится о настройке: enableEventValidation = "false" на странице или в файле web.config для всех страниц.

Я бы предпочел не делать этого, и технически это не так«исправьте» ошибку, просто избегайте ее, судя по всему.

На живом сайте я был бы счастлив с повязкой на данный момент.

спасибо, Евгений, вы меня посадилиправильный путь.Я полагаю, что я подозревал, что Linq к SQL ошибочен, и это должно было быть, возможно, более очевидным из трассировки стека.

К сожалению (или к счастью), я пробую много «новых вещей», так что многие из них еще не виделошибки.

0 голосов
/ 14 апреля 2010

По трассировке стека это не похоже ни на что, связанное с LINQ. Глядя на System.Web в Reflector, кажется, что Page.RequestViewStateString как-то равно нулю. Я бы подтвердил это в отладчике, когда возникнет исключение, и попытался бы отследить, что происходит оттуда (используя Reflector).

...