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()