實體框架核心導航屬性過度加載

c# entity-framework-core npgsql

我剛剛開始使用EF核心(使用NPGSQL),並註意到在沒有明確使用“包含”的情況下如何加載導航屬性的一些奇怪行為。我看到的一個例子:

對象A

ObjectA-> List ObjectB | ObjectA-> List ObjectC

ObjectB-> List ObjectD

設置了所有導航屬性,並且數據庫中有每種類型的項目。

我在沒有任何包含的ObjectA上運行查詢,因此導航屬性應為空。事實並非如此;根據查詢,有時其中一個將在沒有顯式包含的情況下填充(不是兩者,只是ObjectB或ObjectC)。如果我做明確的包含,它們都會出現,就像預期的那樣。這很煩人,但不是我看到的非常糟糕的問題。

假設我查詢一個ObjectC。如果我設置了所有導航屬性,它會按預期加載ObjectA,但現在ObjectA也加載了所有導航屬性;不僅僅是與ObjectC相關的內容。所有ObjectA的孩子(以及他們的孩子)也會回來。這導致數百件物品回歸,與所要求的物品完全無關。

這是代碼優先的(我正在手工創建數據庫,因為NPGSQL中的腳手架似乎非常錯誤)。以下是如何為我的某個實體建模父關係的示例:

entity
  .HasOne<User>(c => c.User)
  .WithMany(p => p.Addresses)
  .HasForeignKey(c => c.UserId)
  .OnDelete(DeleteBehavior.Restrict)
  .HasConstraintName<User, Address>("fk_addresses_user");

如果我查詢單個地址,則會撤回父用戶,但在此之下,每個其他地址也與用戶綁定(這是一個單級關聯,但如果地址有任何子節點,他們也將被撤回) 。

我現在不知所措;我唯一能做的就是從我的模型中刪除所有子導航屬性。

熱門答案

我想'我看到它現在正在做什麼。它是自動包括已經在本地跟踪的其他屬性(這是有道理的,我猜)。我的測試是我一次正在閱讀/創建幾個項目,並且在沒有明確包含的情況下,我對一些正在填寫的內容感到困惑。經過更多測試後,當我有更簡單的查詢沒有訪問同一上下文中的其他實體時,它的行為與我預期的一樣



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow