为什么我的EF系列不懒惰?

时间:2011-06-03 08:06:42

标签: lazy-loading entity-framework-4.1 ef-code-first fluent-interface

我首先使用EF 4.1代码。我有一个用户模型和一个设置模型 每次存储库返回用户时,也会加载设置。我已经将设置标记为虚拟所有访问修饰符都是公共的LazyLoadingEnabled和ProxyCreationEnabled默认启用。
我错过了什么?

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 });
    }
}

1 个答案:

答案 0 :(得分:3)

延迟加载意味着与您认为的含义相反。

  • 延迟加载(虚拟属性和默认值)
      查询Settings 时,不会立即检索到
    • User 第一次访问时,会检索
    • Settings。为了实现这一点,DbContext必须在那时开放;否则你会得到例外
  • 没有延迟加载(非虚拟属性和/或显式禁用)
      查询Settings 时,不会立即检索到
    • User
    • Settings从不自动检索;它将返回 null (在我看来,这是一个糟糕的设计决定: null 是一个错误的值,你不应该得到它)

在这两种情况下,您都可以使用Settings热切地加载.Include(x => x.Settings),或者在需要时,通过调用context.Entry(user).Collection(x => x.Settings).Load()