我剛開始玩EF核心(使用NPGSQL),並注意到一些奇怪的行爲如何導航屬性被加載,而沒有明確使用'包含'。我看到一個例子:實體框架核心導航屬性過度加載
對象A
ObjectA->列表對象B | ObjectA->列表ObjectC
ObjectB->列表ObjectD
所有的導航屬性都設置了,有數據庫中的每個類型的項目。
我在沒有任何包含的情況下對ObjectA運行查詢,所以nav屬性應該是空的。事實並非如此;取決於查詢,有時候其中一個將被填充而沒有明確的包含(不是兩者,只是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");
如果我查詢一個地址,父用戶被拉回,但在每一個其他的地址綁定到用戶以及(這是一個單一級別的協會,但如果地址有任何孩子,他們也將全部撤回)。
我現在虧本;我唯一能做的就是從我的模型中刪除所有的兒童導航屬性。
導航屬性是否定義爲「virtual」? –
IIRC,實體框架有一個強制延遲加載的選項(或禁用急切加載) –
您可以請張貼一些實際的代碼,以便我們可以看到你在做什麼?請張貼您的模型。另外,您可以請您解決您遇到的任何腳手架問題?目前我還沒有意識到任何非常嚴重的事情。 –