2016-10-05 15 views
2

我想在代碼優先使用實體​​框架6.1.3與GridView的WPF應用程序來顯示一些數據。但是,當我試圖查詢數據庫時,部分數據在我返回結果時丟失。Linq到實體框架返回值導致錯誤,如果沒有調試

我有以下的模型類:

public class Categoria 
{ 
    [Key] 
    public Guid IDCategoria { get; set; } 
    public string Nombre { get; set; } 
    public bool Visible { get; set; } 
    public virtual List<SubCategoria> SubCategorias { get; set; } 
} 

public class SubCategoria 
{ 
    [Key] 
    public Guid IDSubCategoria { get; set; } 
    public string Nombre { get; set; } 
    public Categoria IDCategoria { get; set; } 
    public bool Visible { get; set; } 
} 

而且dbContext

public class PresupuestoContext : DbContext 
{ 
    public DbSet<SubCategoria> SubCategorias { get; set; } 
    public DbSet<Categoria> Categorias { get; set; } 

    public PresupuestoContext() 
    { 
     var ensureDLLIsCopied = System.Data.Entity.SqlServer.SqlProviderServices.Instance; 
    } 

查詢數據,我使用下面的函數:

public static IEnumerable<Categoria> GetCategories() 
{ 
    using (var db = new PresupuestoContext()) 
    { 
     var query = (from b in db.Categorias 
        orderby b.Nombre 
        select b).ToList(); 
     return query; 
    } 
} 

的結果返回兩次,直到到達此代碼的GUI:

private void button_Click(object sender, RoutedEventArgs e) 
{ 
    var resultado = Information.GetCategories(); 
    dataGrid.ItemsSource = resultado.ToList(); 
} 

而且數據在網格顯示

expected result

但是,只有當我設置一個斷點在GetCategories()方法,並期待在對象工作

observed debugger

如果我不這樣做,SubCategorias列表會拋出一個錯誤

enter image description here

錯誤:

((System.Data.Entity.DynamicProxies.Categoria_DEF110A52595D71D72012731564BC6530201A7738FF55979B05BFABCE100FD94)new System.Collections.Generic.Mscorlib_CollectionDebugView(resultado).Items 1).SubCategorias

error CS1503: Argument 1: cannot convert from 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.ICollection'

而且我得到以下結果

enter image description here

我怎樣才能使它所以我得到的結果正確,而無需步入調試器?

任何想法爲什麼發生這種情況?

+0

當您查看對象時,還有一個額外的數據庫調用來顯示實際結果(延遲加載)。在此之前,被引用的對象不會被查詢,並且爲null,當您離開上下文(位於GetCategories()的外部)時,它們保留在哪個狀態。既可以通過枚舉結果來利用GetCategories中的Lazy Loading,也可以使用Eager Loading在一個查詢中完成所有內容(EF將創建Join),如@Sampath建議的那樣。 – DevilSuichiro

回答

2

你必須這樣做。

說明:使用Eager加載使用Include

using System.Data.Entity; 

public static IEnumerable<Categoria> GetCategories() 
{ 
    using (var db = new PresupuestoContext()) 
    { 
     var query = (from b in db.Categorias 
        orderby b.Nombre 
        select b) 
        .Include(p => p.SubCategorias) 
        .ToList(); 

     return query; 
    } 
} 
+0

這個伎倆。謝謝 – Zar

+0

熱烈歡迎你:) – Sampath