Почему моя коллекция 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()

Другие вопросы по тегам