所以在我将对象设置为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
对象中有其他更简单的属性,如字符串,正确保存的英镑等。
DbContext
不允许将容器存储在里面吗?或者我做错了什么?
答案 0 :(得分:1)
在C#中工作,我们习惯于处理对象及其内在状态,这可能是一个令人费解的事实, ORM不会保存集合。
基本上这是因为关系数据库不存储集合(与对象数据数据库相反)。在RDBMS中,父记录是独立的实体。子记录'具有'对其父级的引用。相反,在一个对象空间中,父对象包含'has',它的子对象和子对象可以完全忘记它们的父对象。这是ORM跨越我们的'鸿沟'。
现在考虑一下EF的一些事情:
当您查询DbSet
(如db.BlogPosts
)时,EF会从数据库数据中填充new
个对象。它不会重用已缓存的对象。缓存对象(如果有)位于DbSet.Local
集合中。
当您从数据库中获取对象时,EF不会为其集合属性创建集合,除非您还加载这些集合,例如Include
或延迟加载。
所以卸载的集合是null
,除非您自己初始化这些集合,例如在对象的构造函数中。
所以db.BlogPosts.ToList()
创建了全新的对象。有关保存时非空集合的任何信息都会丢失,因为无法存储此信息。