向mydbcontext添加新对象时,在稍后查询对象后,其中一个对象成员(List<>)被设置为null

时间:2014-03-01 07:55:27

标签: 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 = db.BlogPosts.ToList();

当我进入调试模式时,我会检查model.articleList的值,它只是null,而不是新实例化的List<Article>。好像当我将这个List<Article>对象添加到数据库时,它会在我调用db.SaveChanges();时立即处理它。请注意,我在此Article对象中有其他更简单的属性,如字符串,正确保存的英镑等。

DbContext不允许将容器存储在里面吗?或者我做错了什么?

1 个答案:

答案 0 :(得分:1)

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

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

现在考虑一下EF的一些事情:

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

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

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

所以db.BlogPosts.ToList()创建了全新的对象。有关保存时非空集合的任何信息都会丢失,因为无法存储此信息。