1

我先使用EF 4.1代碼。我有一個用戶模型和一個設置模型。
每次存儲庫返回用戶時,設置也會被加載。我將設置標記爲虛擬,我的所有訪問修飾符都是公共的LazyLoadingEnabled和ProxyCreationEnabled默認啓用。
我錯過了什麼?爲什麼我的EF系列不是懶惰?

public class User : BaseEntity 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
    public string Password { get; set; } 
    public virtual ICollection<Setting> Settings { get; set; } 
} 

public class Setting 
{ 
    public int UserID { get; set; } 
    public int SettingID { get; set; } 
    public string Value { get; set; } 
} 

用戶可能有幾個設置,所以在設置中與外鍵存在一對多的關係。
用戶配置

public class UserConfiguration : EntityTypeConfiguration<User> 
{ 
    public UserConfiguration() 
    { 
     HasKey(u => u.ID); 
     HasMany(u => u.Settings).WithOptional().HasForeignKey(u => u.UserID); 
    } 
} 

以及設置配置爲:

public class SettingsConfiguration : EntityTypeConfiguration<Setting> 
{ 
    public SettingsConfiguration() 
    { 
     ToTable("UserSettings"); 
     HasKey(s => new { s.UserID, s.SettingID }); 
    } 
} 
+0

熱烈地加載Settings *每次存儲庫返回用戶時,設置也會被加載*您是什麼意思?你的版本庫用戶檢索是怎樣的? – 2011-06-03 08:13:28

+0

你是如何檢查他們是否懶惰加載或不加載的。例如:如果您在調試模式下檢查它,它將顯示集合的值(通過延遲加載)。在訪問用戶/用戶時檢查由EF生成的sql – Eranga 2011-06-03 08:54:56

+0

我的存儲庫檢索在DbSet 上使用單個檢查很簡單,而且我已經在調試模式下檢查過它。任何建議如何檢查它沒有SQL分析器或任何其他第三方工具,如實體框架分析器? – Sagi 2011-06-03 09:27:00

回答

3

惰性加載意味着什麼,你認爲它的意思相反。

  • 隨着遲緩裝載(虛擬財產和缺省值)
    • Settings查詢User
    • Settings時,它在第一次訪問時檢索時不立即檢索。當時必須打開DbContext纔會發生這種情況;否則查詢User
    • Settings時將永遠自動檢索,你會得到一個異常
  • 沒有
    • Settings不會立即檢索延遲加載(非虛擬財產和/或明確禁用) ;它將返回(在我看來,是一個可怕的設計決定:是一個錯誤的值,你不應該能夠得到它)

在這兩種情況下,您可以通過使用.Include(x => x.Settings)或需要時通過致電context.Entry(user).Collection(x => x.Settings).Load()