渴望加載實體框架核心

c# entity-framework-core

我正在尋找創建條目後加載導航屬性的最優雅/最佳方式。

情況如下:*我在表中創建一行,並按ID鏈接其他2個表。我得到的對像只包含id,而不是實際的鏈接對象。 *通過急切加載我想加載這些對象

context.Entry(b)
    .Reference(e => e.Table1)
    .Reference(e => e.Table2)
    .Load();

似乎不起作用,我無法鏈接引用,所以我可以查詢完整的對象:

context
    .Objects
    .Where(o => o.ID == id)
    .Include(o => o.Table1)
    .Include(o => Table2)
    .FirstOrDefault();

或者這樣做:

context.Entry(b)
    .Reference(e => e.Table1)
    .Load();

context.Entry(b)
    .Reference(e => e.Table2)
    .Load();

但這會產生(我懷疑)2次調用數據庫而不是1次組合調用。或者我錯過了另一種鏈接這些引用的方法?

一般承認的答案

對於此特定方案,您可以使用簡單的匿名類型投影,並依賴於加載相關數據中所述的導航屬性修復:

小費
實體框架核心將自動將導航屬性修復到先前加載到上下文實例中的任何其他實體。因此,即使您沒有明確包含導航屬性的數據,如果之前加載了部分或全部相關實體,仍可能會填充該屬性。

所以以下方法可以完成這項工作:

context.Objects
    .Where(o => o.ID == id)
    .Select(o => new { o.Table1, o.Table2 })
    .Load();

理論上應該更好(只應加載相關數據)。但是,由於當前(v1.1.0)EF Core錯誤,它還會包含所有根對象字段,從而使其等同於Include s的變體:

context.Objects
    .Where(o => o.ID == id)
    .Include(o => o.Table1)
    .Include(o => o.Table2)
    .Load();

我個人會使用第一種方法,因為希望在將來的EF Core版本中修復錯誤,而第二種方法行為是“按設計”。



Related

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