MVC C#奇怪的NullReference异常

Jay*_*Jay 1 c# entity-framework asp.net-mvc-4

我有点奇怪的错误让我感到有些困惑,所以让我画一下这幅画:

我有一个控制器,用房屋的评论更新数据库.如果房子不存在,它会创建一个,然后更新它.

所以这是房子不存在的代码:

if (checkHouse == null)
{
        var department = db.Universitys.Single(d => d.universityName == "NotSet");//make dynamic
        var hws = new House();
        hws.address1 = reviewmodelview.Address1;
        hws.address2 = reviewmodelview.Address2;
        hws.postCode = reviewmodelview.postCode;
        hws.noOfDisputes = 0;
        department.Houses.Add(hws);
        db.SaveChanges(); //created the house and saved the changes, now apply the review to it.

        var theHouse = db.Houses.Single(d => d.address1 == reviewmodelview.Address1);//findhouse
        var rvw = new Review(); //create review
        rvw.condition = reviewmodelview.condition;
        rvw.furniture = reviewmodelview.furniture;
        rvw.overall = reviewmodelview.overall;
        rvw.isApproved = false;
        rvw.review = reviewmodelview.review;
        rvw.user = User.Identity.Name;
        rvw.reviewDate = DateTime.Now;
        theHouse.Reviews.Add(rvw);
        db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

这里是房子确实存在的代码:

else
{
    var theHouse = db.Houses.Single(d => d.address1 == reviewmodelview.Address1);//findhouse
    var rvw = new Review();//create review
    rvw.condition = reviewmodelview.condition;
    rvw.furniture = reviewmodelview.furniture;
    rvw.overall = reviewmodelview.overall;
    rvw.isApproved = false;
    rvw.review = reviewmodelview.review;
    rvw.user = User.Identity.Name;
    rvw.reviewDate = DateTime.Now;
    theHouse.Reviews.Add(rvw);
    db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,如果房子存在,则添加评论.如果房子不存在,房子将被添加到数据库,但代码中断:

theHouse.Reviews.Add(rvw); 
Run Code Online (Sandbox Code Playgroud)

如果我将鼠标悬停在评论上,则说它为空.错误是"对象引用未设置为对象的实例".

但是,如果我再试一次,但这次添加数据库中已存在的房屋的地址并在其中添加断点

theHouse.Reviews.Add(rvw);
Run Code Online (Sandbox Code Playgroud)

它说: {System.Data.Objects.DataClasses.EntityCollection<Data.Manager.Review>}

我无法弄清楚为什么两个相同的代码片段的审查集合为空!

房子模型是这样的:

namespace Data.Manager
{
    public class House
    {
        public virtual int HouseID { get; set; }
        public virtual string postCode { get; set; }
        public virtual string address1 { get; set; }
        public virtual string address2 { get; set; }
        public virtual int noOfDisputes { get; set; } //number of disputes added by tennants
        public virtual int averageRating { get; set; }
        public virtual ICollection<Review> Reviews { get; set; }        
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我能解释为什么会发生这种情况,我会永远爱你.

Ant*_*t P 6

如果你正在创建一个新房子ICollection<Review> Reviews,你必须在使用前初始化它Reviews.Add.它适用于已经存在的房屋的原因是,当您加载现有房屋时,集合将被初始化并填充现有值.

theHouse.Reviews = new List<Review>();在打电话之前,你必须做一些事情theHouse.Reviews.Add.您也可以在构造函数中提前House初始化它,以确保在任何访问尝试之前初始化它.

  • 做得好.打败我吧!+1为构造函数提示. (3认同)