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



因此,在我将对象设置为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集合的任何信息都将丢失,因为无法存储这些信息。

最新更新