簡體   English   中英

將新對象添加到mydbcontext時,稍后我查詢對象后,其中一個對象成員(List <>)設置為null

[英]When adding a new object to mydbcontext, one of the object members (a List<>) is set as null after I query for the object later

因此,在我設置好要在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(); ,它就會立即將其db.SaveChanges(); 請注意,我在此Article對象中還有其他更簡單的屬性,例如字符串,整數等,可以正確保存。

DbContext是否不允許將容器存儲在內部? 還是我做錯了什么?

在C#中工作時,我們習慣於處理對象及其內部狀態,因此ORM不保存集合可能是一個彎腰的事實。

從根本上講,這是因為關系數據庫不存儲集合(與對象數據數據庫相反)。 在RDBMS中,父記錄是獨立實體。 子記錄“具有”對其父項的引用。 相反,在對象空間中,父對象包含“具有”的子對象,並且子對象可以完全忽略其父對象。 這是ORM跨越我們的“鴻溝”。

現在考慮有關EF的一些事情:

  • 當查詢DbSet (例如db.BlogPosts )時,EF從數據庫數據中填充new對象。 它不會重用已緩存的對象。 緩存的對象(如果有)位於DbSet.Local集合中。

  • 當您從數據庫中獲取對象時,EF不會為其集合屬性創建集合,除非您也通過例如Include或lazy loading來加載這些集合。

  • 因此,除非您自己(例如在對象的構造函數中)初始化這些集合,否則已卸載的集合為null

因此, db.BlogPosts.ToList()創建了全新的對象。 有關在保存時具有的非空集合的任何信息都將丟失,因為無法存儲此信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM