ArgumentNullException:值不能为null.参数名称:构造函数

Wiz*_*nlo 4 c# asp.net asp.net-mvc entity-framework

我正在使用EF 7构建一个ASP.NET 5 MVC应用程序.我有三个模型:The Book类:

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; }
}
Run Code Online (Sandbox Code Playgroud)

章节类:

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

和路径类,我介绍的只是为了在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; }
    }
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试使用myDbContext访问数据库时,这样:

var list = _db.Paths.ToList();
Run Code Online (Sandbox Code Playgroud)

我得到一个异常:ArgumentNullException:值不能为null.参数名称:构造函数.我试图以不同的方式访问它,但总是以该异常结束.

PS应用程序的源代码完全在 GitHub上

410*_*one 6

您需要Path对象的默认构造函数:

public Path()
{
}
Run Code Online (Sandbox Code Playgroud)

实体框架(很像我所能想到的所有JSON Serializers,XML Serializers和其他serailizers)需要在所有对象上使用默认构造函数,以便正确地序列化/保存和取消选择/加载它.

这个问题很好地解答了:

在JSON反序列化期间,没有为'System.String'类型定义无参数构造函数

基本上,Serailizer/Deserailizer需要创建一个空对象来为其赋值.它无法做出决定使用什么构造函数的复杂决策.是的,可以说它可以推断出哪些属性通过名称进入构造函数,但在你的情况下它甚至不能这样做(它甚至不会尝试,但这超出了我的观点).将调用构造函数中的参数s,但您没有要匹配的属性s.(同样,这不是它会尝试的任何东西,但如果它可能会失败.)

基本上,如果您计划对类型进行任何序列化/反序列化/数据库保存/数据库加载,则需要实现默认构造函数,即使它所做的只是创建一个完全清空的对象.