我首先使用EF Model與POCO實體和自定義DbContexts。我的問題是,設置LazyLoadingEnabled=false
不會影響任何東西,導航屬性仍然加載。 下面是我簡化的例子。LazyLoadingEnabled設置似乎不適用於EF 5
實體程序。程序可以是其它程序的一部分:
namespace Domain.Entities
{
using System;
using System.Collections.Generic;
public partial class Program
{
public Program()
{
this.Programs = new HashSet<Program>();
}
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public System.DateTime StartDate { get; set; }
public System.DateTime EndDate { get; set; }
public Nullable<int> ProgramId { get; set; }
public virtual ICollection<Program> Programs { get; set; }
public virtual Program OwnerProgram { get; set; }
}
}
的的DbContext:
namespace Infrastructure.Model
{
public class ProgramContext : DbContext
{
public ProgramContext()
: base("name=MyContainer")
{
Configuration.LazyLoadingEnabled = false;
}
public DbSet<Program> Programs { get; set; }
}
}
這是我如何使用它:
private ProgramContext _dbContext = new ProgramContext();
// GET api/program
public IEnumerable<Program> GetPrograms()
{
List<Program> list = _dbContext.Programs.ToList();
return list;
}
使用上述樣品,EF仍然加載程序和Program類的OwnerProgram屬性。我嘗試刪除虛擬關鍵字,禁用代理創建,並驗證模型本身的LazyLoadingEnabled=false
。
我錯過了什麼嗎?
謝謝,這就是我所看到的。有沒有什麼辦法可以讓EF不加載導航屬性,除非我使用.Include()? – gixen 2013-05-04 20:05:11
@gixen:如上所述,它並不真正「加載」。關係修正只是將實體放入已經加載的導航集合和引用中。所以,沒有查詢開銷。如果要在加載後修改實體,則需要更改跟蹤,並且不能禁用此行爲。如果沒有在只讀情況下進行更改跟蹤,您可以嘗試'_dbContext.Programs.AsNoTracking()。ToList()'。但我不確定在這種情況下它是否會有所幫助。 – Slauma 2013-05-04 20:52:01
我從這個答案中得出的結論是沒有辦法在沒有打開上下文的情況下在EF中加載整個對象圖形以延遲加載導航屬性。 OR .Include(「NavigationProtperyName」)可以顯式調用來加載導航屬性,但它是每個查詢所必需的。 – 2013-11-01 16:49:32