C# 向mydbcontext添加新对象时,在我稍后查询该对象后,其中一个对象成员(列表<;>;)被设置为null

C# 向mydbcontext添加新对象时,在我稍后查询该对象后,其中一个对象成员(列表<;>;)被设置为null,c#,database,entity-framework,asp.net-mvc-5,C#,Database,Entity Framework,Asp.net Mvc 5,因此,在我设置了要在MyDbContext db中设置的对象之后,如下所示: Article newBlogPost = new Article() { ArticleComments = new List<Comment>() }; db.BlogPosts.Add(newBlogPost); db.SaveChanges(); 进入调试模式时,我检查model.articleList的值,它只是null,而不是新实例化的List。这就好像当我将这个列表对象添加到数据库

因此,在我设置了要在
MyDbContext db
中设置的对象之后,如下所示:

Article newBlogPost = new Article()
{
    ArticleComments = new List<Comment>()
};

db.BlogPosts.Add(newBlogPost);
db.SaveChanges();
进入调试模式时,我检查
model.articleList
的值,它只是
null
,而不是新实例化的
List
。这就好像当我将这个
列表
对象添加到数据库中时,只要我调用
db.SaveChanges(),它就会处理掉它
注意,在这篇
文章中,我还有其他更简单的属性,比如字符串、整数等,可以正确保存

DbContext
是否不允许将容器存储在其中?还是我做错了什么?

在C语言中工作#我们已经习惯于处理对象及其内部状态,ORM不保存集合可能是一个令人费解的事实

从根本上说,这是因为关系数据库不存储集合(与对象数据数据库相反)。在RDBMS中,父记录是一个独立的实体。子记录“具有”对其父记录的引用。相反,在对象空间中,父对象包含“has”,它的子对象和子对象可以完全忘记它们的父对象。这是ORM为我们跨越的“鸿沟”

现在考虑一下EF:

  • 当您查询
    DbSet
    (如
    db.BlogPosts
    )时,EF会从数据库数据中填充
    新的
    对象。它不会重用缓存的对象。缓存对象(如果有)位于
    DbSet.Local
    集合中

  • 从数据库中获取对象时,EF不会为其集合属性创建集合,除非您也加载这些集合,例如通过
    Include
    或延迟加载

  • 因此,卸载的集合是
    null
    ,除非您自己初始化这些集合,例如在对象的构造函数中


因此
db.BlogPosts.ToList()
创建全新的对象。由于无法存储这些信息,因此保存时有关非空集合的任何信息都将丢失。

是否从数据库加载复杂类型?我猜您不是从数据库中加载它们:请参阅db.BlogPosts.Include(“ArticleComments”).First();回顾这一点,我发现这只是对发生了什么的“枯燥”解释,而不是你想怎么做就怎么做。我认为您应该将
virtual
修饰符添加到
ArticleComments
集合成员。这将使EF能够创建一个代理
Article
对象,该对象可以延迟加载,因此它确实有一个初始化的集合(但在加载之前为空)。
model.articleList = db.BlogPosts.ToList();