2014-09-02 19 views
3

我有2類(用戶和設備)定義如下。的EntityFramework顯式加載不檢索所有實體

public class User { 
    public int UserId { get; set; } 
    public virtual ICollection<Device> Devices { get; set; } 
    ... 
} 

public class Device { 
    public int UserId; 
    public virtual User User { get; set; } 
    ... 
} 

我有這兩個實體的每一個的存儲庫,我已經禁用了我的數據上下文中的延遲加載,就像這樣。

public class MyDbContext : DbContext 
{ 
    public MyDbContext() 
     : base(name=MyDbContext) 
    { 
     this.Configuration.LazyLoadingEnabled = false; 
    } 
} 

我試圖檢索到與用戶帳戶關聯的所有設備。

我試圖在兩種不同的方式這樣做。

方法#1 - 使用其中

using (MyDbContext dbContext = new MyDbContext()) 
{ 
    // performing some database operations ... 

    var user = dbContext.Users.Find(8); 

    // do some operations 

    if (user.Devices == null or user.Devices.Count() ==0)   
    var devices = dbContext.Devices.Where(d => d.UserId == user.UserId).ToList(); 
} 

出於某種原因,方法#1不總是從設備集檢索 - 在用戶關聯的屬性

using (MyDbContext dbContext = new MyDbContext()) 
{ 
    // performing some database operations ... 

    var user = dbContext.Users.Find(8); 

    // do some operations 

    if (user.Devices == null or user.Devices.Count() ==0) 
    dbContext.Entry(user).Collection(u => u.Devices).Load(); 

    var devices = user.Devices; 
} 

方法2調用load檢索所有設備,但方法#2檢索所有設備!有人能解釋我做錯了什麼嗎?

我開始的SQL Server Profiler來看看我是否做錯了什麼。兩種方法生成的查詢都是相同的。所以我很困惑我做錯了什麼!

+0

什麼版本的實體框架? – 2014-09-02 15:06:22

+0

實體框架5 – 2014-09-02 15:28:58

回答

4

有人可以解釋我什麼,我做錯了什麼?

我無法解釋爲什麼你遇到你正在經歷什麼,但我個人不使用Find()也不Load()那些方法,他們與當地上下文高速緩存是如何工作的條件是複雜的。由於您檢索只有一個用戶沒有Cartesian問題

var user = dbContext.Users 
    .Include(u => u.Devices); 
    .FirstOrDefault(u => u.id = 8); 

:因此,我建議以下查詢。此查詢將用用戶在單個語句的用戶相關聯的所有設備上下文和。

如果你真的需要之後,將所有設備的獨立變量:

var devices = user.Devices; 

重要注意到我的回答是,因爲我通常在網絡環境中與實體框架處理,我的代碼不斷創建/處理上下文,因此本地緩存實體框架幾乎是無用的。對於非無狀態應用(的Winforms/WPF),這可能不是最好的解決方案。

每秒更新您的評論

是否有裝載在以後的任何其他方式?

正如Brendan Green's Comment提到你可以使用:

var devices = dbContext.Devices 
    .Where(w => w.UserId == 8); 

(請注意,這並不執行對數據源的查詢)。

+0

我是新來的實體框架,所以我仍然不完全熟悉不同的表達式。是否包含檢索所有用戶標識爲8的設備?還是從數據庫中檢索所有設備,然後過濾那些用戶標識爲8的設備? – 2014-09-02 16:23:35

+0

第一個命題是真的。爲了說服自己,請使用[linqpad](http://www.linqpad.net/) – tschmit007 2014-09-02 16:25:48

+0

@ParthShah我還更新了我的答案,以使其更具體。 – 2014-09-02 16:38:36

相關問題