Почему моя коллекция EF не ленива? - PullRequest
1 голос
/ 03 июня 2011

Сначала я использую код 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 Ответ

3 голосов
/ 05 июня 2011

Ленивая загрузка означает противоположность того, что вы думаете, это означает.

  • С отложенной загрузкой (виртуальная собственность и настройки по умолчанию)
    • Settings не получается сразу при запросе User
    • Settings извлекается при первом обращении к нему. DbContext должен быть открыт в это время, чтобы это произошло; в противном случае вы получите исключение
  • Без отложенной загрузки (не виртуальное свойство и / или явное отключение)
    • Settings не получается сразу при запросе User
    • Settings не будет никогда извлекаться автоматически; он вернет ноль (что, на мой взгляд, ужасное дизайнерское решение: ноль - неправильное значение, и вы не сможете его получить)

В обоих случаях вы можете быстро загрузить Settings, используя .Include(x => x.Settings), или, если необходимо, позвонив по номеру context.Entry(user).Collection(x => x.Settings).Load()

.
...