我想在代碼優先使用實體框架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();
}
而且數據在網格顯示
但是,只有當我設置一個斷點在GetCategories()
方法,並期待在對象工作
如果我不這樣做,SubCategorias
列表會拋出一個錯誤
錯誤:
((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'
而且我得到以下結果
我怎樣才能使它所以我得到的結果正確,而無需步入調試器?
任何想法爲什麼發生這種情況?
當您查看對象時,還有一個額外的數據庫調用來顯示實際結果(延遲加載)。在此之前,被引用的對象不會被查詢,並且爲null,當您離開上下文(位於GetCategories()的外部)時,它們保留在哪個狀態。既可以通過枚舉結果來利用GetCategories中的Lazy Loading,也可以使用Eager Loading在一個查詢中完成所有內容(EF將創建Join),如@Sampath建議的那樣。 – DevilSuichiro