2015-05-13 4 views
4

Я строю ASP.NET MVC 5 приложения, используя EF 7. У меня есть три модели: Книга класса:ArgumentNullException: значение не может быть нулевым. Имя параметра: Конструктор

public class Book : IBook<MangaChapter>, IHasThumbnail, IBugChecker 
    { 
     public Book() 
     { 
      Chapters = new List<MangaChapter>(); 
     } 

     [Key] 
     public int ID { get; set; } 


     [Required] 
     public string Title { get; set; } 

     [Required] 
     [DataType(DataType.MultilineText)] 
     public string Description { get; set; } 

     public string ThumbnailPath { get; set; } 

     public virtual IList<Chapter> Chapters { get; set; } 
} 

Глава Класс:

public class MangaChapter : IChapter<MangaBook>, IHasThumbnail 
    { 
     public MangaChapter() 
     { 
      PagesPath = new List<Path>(); 
     } 

     [Key] 
     public int ID { get; set; } 

     [Required] 
     public string Title { get; set; } 

     public string ThumbnailPath { get; set; } 

     public IList<Path> PagesPath { get; set; } 

     public int BookID { get; set; } 
     public MangaBook Book { get; set; } 
    } 
} 

и класс путь, который я представил только для хранения списка в EF

public class Path 
    { 
     public Path(string s) { P = s; } 

     public int ID { get; set; } 

     public string P { get; set; } 

     public int MangaChapterID { get; set; } 

     public MangaChapter MangaChapter { get; set; } 

     public static implicit operator Path(string s) 
     { 
      return new Path(s); 
     } 

     public static implicit operator string(Path s) 
     { return s.P; } 
    } 

проблема, когда я тр у для доступа к базе данных с помощью myDbContext, таким образом:

var list = _db.Paths.ToList(); 

я получаю исключение: ArgumentNullException: Значение не может быть пустым. Имя параметра: конструктор. Я пытался получить доступ к нему по-разному, но всегда получал это исключение.

P.S. исходный код приложения полностью на GitHub

+0

Is _db null или Paths null? – tofutim

+1

'Path' не имеет конструктора по умолчанию. Добавьте 'public Path() {}' и посмотрите, исправляет ли он это. –

+0

@EBrown Большое спасибо, сейчас это работает! – WizardOfMenlo

ответ

6

Вам необходимо конструктор по умолчанию на Path объекта:

public Path() 
{ 
} 

Entity Framework (подобно всем JSON сериализаторы, XML сериализаторы и другие serailizers я могу подумайте) требует конструктора по умолчанию на всех объектов, чтобы правильно сериализовать/сохранить и удалить/загрузить его.

Этот вопрос отвечает на это довольно хорошо:

No parameterless constructor defined for type of 'System.String' during JSON deserialization

В основном, Serailizer/Deserailizer необходимо создать пустой объект, чтобы присвоить значение к нему. Он не способен принять сложное решение о том, какой конструктор использовать. Да, можно было бы аргументировать, что он может определить, какие свойства входят в конструктор по именам, но в вашей ситуации он даже не может этого сделать (чего бы он даже не пытался, но это не в моих силах). Параметр в вашем конструкторе будет называться s, но у вас нет свойства, чтобы соответствовать s. (Опять же, это не что-то, что он мог бы попробовать, но если бы он мог это потерпеть неудачу.)

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

+0

Конструктор может быть закрытым. – Bryan

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