Почему моя коллекция EF не ленива?
Сначала я использую код 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 ответ
Ленивая загрузка означает противоположность того, что вы думаете, это означает.
- С ленивой загрузкой (виртуальная собственность и настройки по умолчанию)
Settings
не извлекается сразу при запросеUser
Settings
извлекается при первом обращении.DbContext
должен быть открыт в это время, чтобы это произошло; в противном случае вы получите исключение
- Без отложенной загрузки (не виртуальное свойство и / или явное отключение)
Settings
не извлекается сразу при запросеUser
Settings
никогда не будет получен автоматически; он вернет ноль (что, на мой взгляд, ужасное дизайнерское решение: ноль - неправильное значение, и вы не сможете его получить)
В обоих случаях вы можете загрузить Settings
охотно с помощью .Include(x => x.Settings)
или при необходимости, позвонив context.Entry(user).Collection(x => x.Settings).Load()