2013-02-22 2 views
1

Я получаю немного странной ошибки, который оставил мне немного сбит с толку, поэтому позвольте мне нарисовать картину:MVC C# странное NullReference Исключение

У меня есть контроллер, который обновляет базу данных с обзорами по домам. Если дом не существует, он создает один, а затем обновляет его.

Так что это код, если дом не существует:

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(); 
} 

и вот код, если дом действительно существует:

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(); 
} 

Теперь проблема заключается в этом, если дом существует, добавлен обзор. Если дом не существует, дом добавляется в базу данных, но код перерывы на:

theHouse.Reviews.Add(rvw); 

И если я парить мышь над Отзывы он говорит, что его нуль. Ошибка: «Ссылка на объект не установлена ​​в экземпляр объекта».

Однако, если я попробую еще раз, но на этот раз добавить адрес дома, который уже существует в базе данных и добавить точку останова в

theHouse.Reviews.Add(rvw); 

он говорит: {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; }   
    } 
} 

Если бы я мог получить объяснение, почему это происходит, я люблю тебя навсегда.

ответ

6

Если вы создаете новый дом с ICollection<Review> Reviews, вам придется инициализировать это, прежде чем вы сможете использовать Reviews.Add. Причина, по которой это будет работать для дома, который уже существует, будет заключаться в том, что при загрузке существующего дома коллекция будет инициализирована и заполнена существующими значениями.

Прежде чем позвонить по телефону theHouse.Reviews.Add, вам необходимо будет сделать что-то по линии theHouse.Reviews = new List<Review>();. Вы также можете инициализировать это заранее в конструкторе для House, чтобы убедиться, что он инициализирован до любых попыток доступа.

+3

Молодцы. Побей меня! +1 для кончика конструктора. – da7rutrak

0

Как и в предыдущем ответе, вам необходимо инициализировать объект Обзоров, прежде чем добавлять к нему элементы.

Вы можете сделать свой код немного лучше, только сохраняя изменения один раз вместо того, чтобы делать два вызова в БД.

 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; 
      hws.Reviews = new List<Review>(); 

      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; 
      hws.Reviews.Add(rvw); 
      department.Houses.Add(hws); 

      db.SaveChanges(); 

     } 
+0

А я вижу, я добавил, что дополнительные изменения, потому что я думал, что это была проблема для начала. Я возьму его. Спасибо как – Jay

2

Попытка инициализировать коллекцию обзоров, как это в доме конструктора

namespace Data.Manager 
{ 
    public class House 
    { 
     public House() 
     { 
      Reviews = new List<Review>(); 
     } 

     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; }   
    } 
} 
+0

спасибо за ответ @ muammer.hallac –

Смежные вопросы