实体框架4.1-为什么我的EF集合不懒惰



我首先使用EF 4.1代码。我有一个用户模型和一个设置模型
每次存储库返回用户时,都会加载设置。我已经将Setting标记为virtual。我的所有访问修饰符都是public 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 });
    }
}

懒惰加载的含义与您认为的相反。

  • 使用延迟加载(虚拟属性和默认值)
    • 查询User时不会立即检索到Settings
    • Settings在第一次访问时被检索。DbContext必须在此时打开,才能发生这种情况;否则会出现异常
  • 无延迟加载(非虚拟属性和/或显式禁用)
    • 查询User时未立即检索到Settings
    • Settings永远不会自动检索;它将返回null(在我看来,这是一个糟糕的设计决策:null是一个错误的值,你不应该得到它)

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

相关内容

  • 没有找到相关文章

最新更新