2016-08-24 70 views
0

我剛開始玩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"); 

如果我查詢一個地址,父用戶被拉回,但在每一個其他的地址綁定到用戶以及(這是一個單一級別的協會,但如果地址有任何孩子,他們也將全部撤回)。

我現在虧本;我唯一能做的就是從我的模型中刪除所有的兒童導航屬性。

+0

導航屬性是否定義爲「virtual」? –

+0

IIRC,實體框架有一個強制延遲加載的選項(或禁用急切加載) –

+0

您可以請張貼一些實際的代碼,以便我們可以看到你在做什麼?請張貼您的模型。另外,您可以請您解決您遇到的任何腳手架問題?目前我還沒有意識到任何非常嚴重的事情。 –

回答

0

我'想'我明白它現在在做什麼。它是自動的,包括已經在本地跟蹤的其他屬性(我猜想這是有道理的)。我的測試是一次性閱讀/創建幾個項目,而我卻被一些沒有明確包含的東西填滿而感到困惑。經過更多測試後,其行爲與我期望的一樣,當我有更簡單的查詢不在同一上下文中訪問其他實體時