我正在使用EF 7构建ASP.NET 5 MVC应用程序。 我有三种型号: 书类:
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:值不能为null。 参数名称:构造函数。 我试图以不同的方式访问它,但总是以这种例外结束。
P.S。 该应用程序的源代码完全在GitHub
答案 0 :(得分:6)
您需要Path
对象上的默认构造函数:
public Path()
{
}
实体框架(很像我所能想到的所有JSON Serializers,XML Serializers和其他serailizer)需要在所有对象上使用默认构造函数才能正确序列化/保存和取消选择/加载它
这个问题很好地解答了:
No parameterless constructor defined for type of 'System.String' during JSON deserialization
基本上,Serailizer / Deserailizer需要创建一个空对象来为其赋值。它无法做出决定使用什么构造函数的复杂决策。是的,可以说它可以推断出哪些属性通过名称进入构造函数,但在你的情况下它甚至不能这样做(它甚至不会尝试,但这超出了我的范围)点)。构造函数中的参数称为s
,但您没有与s
匹配的属性。 (同样,这不是它会尝试的任何东西,但如果它可能会失败。)
基本上,如果您计划对类型进行任何序列化/反序列化/数据库保存/数据库加载,则需要实现默认构造函数,即使它只是创建一个完全清空的对象。