2017-03-04 36 views
1

我在C#一個奇怪的行爲與EF 這是一個與EF核心.NET核心項目1.1.0在實體框架的核心沒有嵌套結果

"Microsoft.EntityFrameworkCore.SqlServer": "1.1.0", 
"Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final", 

我已經創建了兩個模型,「用戶」和「Group」

public class User 
{ 
    public int Id { get; set; } 
    public string name { get; set; } 
    public string lastName { get; set; } 

    public List<Group> Groups { get; set; } 
} 

public class Group 
{ 
    public int Id { get; set; } 
    public string groupName { get; set; } 
    public virtual User User { get; set; } 
} 

結果schould給我一個用戶列表他的組。

現在奇怪的部分:

結果來自DB回來,我看着ALLUSER,組是空

我看看到上下文看組

組充滿:

Groups are filled

現在我又把眼光投向ALLUSER結果和神奇 在GR在每個用戶項目內填充oup。

組是內部填充用戶:

Groups are filled inside User

我非常感謝所有幫助!

回答

4

看起來你是懶惰加載實體。

您可以使用.Include來加載它們。

var allUsers = context.Users.Include(user => user.Groups).ToList(); 

此方法加載第一個實體(用戶)以及相關實體作爲查詢(組)的一部分。

+2

實體框架核心沒有延遲加載。例如LazyLoadingEnabled將不可用。更多信息:https://docs.microsoft.com/en-us/ef/core/querying/related-data(EF Core尚不能使用延遲加載。) – Ben

+0

是的,它適用於.Include,謝謝。所有這麼多! – KroKro

0

這並不神奇,DbContext不會從數據庫下載實體,除非您不打算這樣做。當您在調試中單擊context.GroupsResults View時,DbContext從數據庫獲取所有組,然後它可以關聯到用戶。

我認爲你正在尋找方法,包括在那裏你可以得到相關的羣體的用戶在一個查詢這樣的:

var allUsers = context.Users.Include(u => u.Groups).ToList(); 
0

這種現象來源於裝載實體的懶惰。

默認情況下,您必須手動加載每個子實體。它被稱爲急切加載。

爲了加速您的實體,您必須在每個導航屬性上使用.Include()方法。

例如context.User.Include(x => x.Groups)

Include方法生成一個新的SQL語句以從數據庫中檢索您的組。

然後,您可以使用ToList()方法強制執行您的查詢。