我首先使用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()