2013-10-05 2 views
0

Может ли кто-нибудь предложить причину следующей проблемы? Мой код разбивается на линииИсключительное исключение ссылки на навигационное свойство

integerList.Integers.Add(integer); 

с сообщением об ошибке

Object reference not set to an instance of an object. 

IntegerList.Integers является недействительным, который я подозреваю, что является причиной, а что такое решение? Должен ли я устанавливать значения IntegerList.Integers при инициализации переменной, чтобы она никогда не была нулевой?

Модели

public class IntegerList 
{ 
    public int IntegerListID { get; set; } 
    public string Direction { get; set; } 
    public long Performance { get; set; } 
    public virtual ICollection<Integer> Integers { get; set; } 
} 

public class Integer 
{ 
    public int IntegerID { get; set; } 
    public int IntegerValue { get; set; } 
    public int IntegerListID { get; set; } 
    public virtual IntegerList IntegerList { get; set; } 
} 

ViewModel

public class IntegerViewModel 
{ 
    [UIHint("Integers")] 
    public IntegerValueViewModel IntegerValues { get; set; } 
    public string Direction { get; set; } 
} 

public class IntegerValueViewModel 
{ 
    public ICollection<int> IntegerValue { get; set; } 
} 

Контроллер

[HttpPost] 
    public ActionResult Index(IntegerViewModel integerViewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      var integerList = new IntegerList 
      { 
       Direction = integerViewModel.Direction 
      }; 

      foreach (var item in integerViewModel.IntegerValues.IntegerValue) 
      { 
       var integer = new Integer { IntegerValue = item }; 
       integerList.Integers.Add(integer); 
      } 
+0

Практически все случаи исключения NullReferenceException одинаковы. См. «[Что такое исключение NullReferenceException в .NET?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)» для некоторых советов. –

ответ

4

Поскольку Integers свойство не инициализировано и оно равно null. Вы пытаетесь вызвать метод Add на нулевой вещь, которая дала вам ошибку

Решение: Инициализировать свойство в IntegerList конструктор класса

public class IntegerList 
{ 
    public int IntegerListID { get; set; } 
    public string Direction { get; set; } 
    public long Performance { get; set; } 
    public virtual ICollection<Integer> Integers { get; set; } 

    public IntegerList() 
    { 
     Integers =new List<Integer>(); 
    } 
} 
+0

Будьте осторожны при создании экземпляров дочерних объектов как 'new List '. Если вы инициализируете дочернюю коллекцию «Целые» как «новый список » в конструкторе, тогда, когда вы хотите сделать предложение «.Where» в дочернем свойстве «Целые числа», вы получите все дочерние «Целые числа» из Db для этой родительской записи, а затем будет применяться предложение '.Where'. Если дочерний список большой, это резко влияет на производительность. – Gwasshoppa

0

Когда вы делаете

var integerList = new IntegerList 
      { 
       Direction = integerViewModel.Direction 
      }; 

Связанные целые числа не инициализированы, вы можете инициализировать его в IntegerList contsctructor. или выполните следующие действия:

var integerList = new IntegerList 
       { 
        Direction = integerViewModel.Direction, 
        Integers=new List<Integer>() 

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