![](/img/trans.png)
[英]System.NullReferenceException: „Object reference not set to an instance of an object.” problem
[英]System.NullReferenceException Object reference not set to an instance of an object. on Model instantiation - SOMETIMES
我收到System.NullReferenceException對象引用未設置為模型實例化時的對象實例,但有時只是。 我的用戶有時會遇到錯誤,但一旦他們重新提交,則不會發生異常。 我無法弄清楚錯誤發生的原因。
這是ELMAH的錯誤日志:
System.NullReferenceException: Object reference not set to an instance of an object.
at Plus.Controllers.Review.ReviewNoteController.Save(ReviewNoteViewModel viewModel) in C:\Users\Rhys\Documents\Development\witplus-master\Plus\Controllers\Review\ReviewNoteController.cs:line 139
at lambda_method(Closure , ControllerBase , Object[] )
at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<>c__DisplayClass2b.<BeginInvokeAction>b__1c()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult)
at System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
at System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)
at System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
at System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult)
at System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult)
at System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
這是我的代碼:
// Update Note
if (viewModel.ID != 0)
{
ReviewNote rn = _repository.Get<ReviewNote>(viewModel.ID);
MapViewModelToModel(rn, viewModel);
_repository.Update<ReviewNote>(rn);
}
// Create Note
else
{
ReviewAnswer ra = _repository.Get<ReviewAnswer>(viewModel.AnswerId);
bool newAnswer = false;
// Check if practice or checklists
if (viewModel.Referrer == Referrer.ReviewPractice)
{
// Create a new answer if it hasn't been answered yet. Could have made a bool in the GET method, but it's best to recheck to make sure no-one has answered in the mean time.
if (hasNoAnswer_PracticeLevel(viewModel.QuestionId))
{
ra = new ReviewAnswer();
ra.entityLevelAudit = true;
ra.entityId = this.LoggedInEntity.EntityId;
ra.questionId = viewModel.QuestionId;
ra.lastUpdateDate = DateTime.Now;
_repository.Save<ReviewAnswer>(ra);
newAnswer = true;
viewModel.AnswerId = ra.Id;
}
}
else
{
// Create a new answer if it hasn't been answered yet.
if (hasNoAnswer_Checklist(viewModel.QuestionId))
{
ra = new ReviewAnswer();
ra.entityLevelAudit = false;
ra.entityId = this.LoggedInEntity.EntityId;
ra.questionId = viewModel.QuestionId;
ra.userId = this.SelectedUser.UserId;
ra.lastUpdateDate = DateTime.Now;
_repository.Save<ReviewAnswer>(ra);
newAnswer = true;
viewModel.AnswerId = ra.Id;
}
}
ReviewNote rn = new ReviewNote();
rn.auditID = ra.Id;
rn.Type = (int)this.LoggedInUser.ReviewTypeId; //Audit Note type is the user audit type
MapViewModelToModel(rn, viewModel);
_repository.Save<ReviewNote>(rn);
}
錯誤發生在第139行,即:
ReviewNote rn = new ReviewNote(); // 6th last line.
ReviewNote模型代碼是:
using Plus.Models.UserModel;
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Web;
using System.Web.Mvc;
namespace Plus.Models.Review
{
public class ReviewNote : BaseModel
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), Column("AuditNoteId")]
public int ID { get; set; } // AuditNoteId
public int auditID { get; set; }
[ForeignKey("auditID")]
public virtual ReviewAnswer Answer { get; set; }
[StringLength(10000), AllowHtml, Column("noteText")]
public string Text { get; set; } //noteText
[StringLength(200), Column("noteFile")]
public string URL { get; set; } //noteFile
[DataType(DataType.DateTime), Column("lastUpdateDate")]
public DateTime LastUpdated { get; set; }//lastUpdateDate
[Column("showNoteToAll")]
public bool VisibleToAll { get; set; } //ShowNoteToAll
[Required]
public int NoteBy { get; set; } //NoteBy
[ForeignKey("NoteBy")]
public virtual User By { get; set; }
[Column("noteType")]
public int Type { get; set; } //NoteType
}
}
這是BaseModel代碼:
public abstract class BaseModel
{
[NotMapped, JsonIgnore]
public Alias Alias { get; set; }
[NotMapped, JsonIgnore]
public IDictionary<string, object> AliasDictionary { get; set; }
[NotMapped, JsonIgnore]
public AppUserDTO LoggedInAppUser { get; set; }
[NotMapped, JsonIgnore]
public UserDTO LoggedInUser { get; set; }
[NotMapped, JsonIgnore]
public EntityDTO LoggedInEntity { get; set; }
[NotMapped, JsonIgnore]
public ResourceDTO LoggedInUsersResource { get; set; }
[NotMapped, JsonIgnore]
public virtual ICollection<MenuItemClaim> MenuSystemTreeClaims { get; set; }
[NotMapped, JsonIgnore]
public IStateProvider UserSession { get; set; }
[NotMapped, JsonIgnore]
public UserDTO SelectedUser { get; set; }
[NotMapped, JsonIgnore]
public TermsAndConditions TAC { get; set; }
[NotMapped, JsonIgnore]
public string PageClaimValue { get; set; }
}
我無法理解為什么在ReviewNote的實例化中會出現NullReferenceException。 如果有人能提出建議,那將是最有幫助的,因為它對我的用戶來說越來越成為一個問題。
我的項目是帶有Identity 2和Entity Framework 6.2的ASP.NET MVC5。 我認為錯誤只是在我將Entity Framework 6.1升級到6.2之后才開始,但這只是猜測。
謝謝。
正如評論者所指出的那樣,在構造ReviewNote
似乎沒有任何東西可以產生NullReferenceException
,並且在你自己的代碼中沒有任何代碼出現在stacktrace中。
過去我遇到過一些問題,堆棧跟蹤中給出的行號與發生實際錯誤的位置相距幾行。 如果您無法使用附加的調試器來捕獲它,我可以建議您添加某種信息來補充行號。 一個簡單的方法是遞增整數:
int debugId = 0;
try
{
ReviewNote rn = new ReviewNote(); // debugId == 0
++debugId;
rn.auditID = ra.Id; // debugId == 1
++debugId;
rn.Type = (int)this.LoggedInUser.ReviewTypeId; // debugId == 2
++debugId;
MapViewModelToModel(rn, viewModel); // debugId == 3
++debugId;
_repository.Save<ReviewNote>(rn); // debugId == 4
}
catch (NullReferenceException nre)
{
throw new Exception("debugId:" + debugId, nre);
}
debugId
的值將告訴您發生故障的行
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.