因此,在我将对象设置为MyDbContext db
后,如下所示:
Article newBlogPost = new Article()
{
ArticleComments = new List<Comment>()
};
db.BlogPosts.Add(newBlogPost);
db.SaveChanges();
我稍后在不同的视图中访问同一个对象,如下所示:
model.articleList = db.BlogPosts.ToList();
当我进入调试模式时,我检查model.articleList
的值,它只是null
,而不是新实例化的List<Article>
。就好像当我将这个List<Article>
对象添加到数据库中时,它会在我调用db.SaveChanges();
时立即处理它。注意,在这个Article
对象中,我还有其他更简单的属性,如字符串、int等,可以正确保存。
DbContext
是否不允许在里面存放集装箱?还是我做错了什么?
在C#中工作,我们已经习惯于处理对象及其内部状态,ORM不保存集合可能是一个令人费解的事实。
从根本上说,这是因为关系数据库不存储集合(与对象数据数据库相反)。在RDBMS中,父记录是一个独立的实体。子记录"具有"对其父记录的引用。相反,在对象空间中,父对象包含其子对象"has",并且子对象可以完全忽略其父对象。这是ORM为我们跨越的"鸿沟"。
现在考虑一下关于EF:的一些事情
-
查询
DbSet
(如db.BlogPosts
)时,EF会从数据库数据中填充new
对象。它不会重用缓存的对象。缓存的对象(如果有的话)在DbSet.Local
集合中。 -
当您从数据库中获取对象时,EF不会为其集合属性创建集合,除非您也加载这些集合,例如通过
Include
或延迟加载。 -
因此,卸载的集合是
null
,除非您自己初始化这些集合,例如在对象的构造函数中。
因此db.BlogPosts.ToList()
创建了全新的对象。保存时有关非null集合的任何信息都将丢失,因为无法存储这些信息。