Как избежать ленивой загрузки при доступе к свойству идентификатора внешнего ключа через навигационное свойство?

c# ef-code-first entity-framework entity-framework-6

Вопрос

Я в процессе преобразования проекта из NHibernate в Entity Framework 6.

Учитывая эту простую модель:

public class User
{
    public int ID { get; set; }
    public string FullName { get; set; }
    public virtual Organization Organization { get; set; }
    // [...]
}

public class Organization
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual List<User> Users { get; set; }
    // [...]
}

Доступ к первичному ключу (ID) через свойство навигации Организации приведет к тому, что весь объект организации будет загружен в контекст:

foreach(var user in db.Users)
    Console.WriteLine(user.Organization.ID);

Учитывая, что внешний ключ OrganizationID является частью строки User, я должен иметь доступ к нему, не вызывая Lazy Load всей сущности (и, действительно, NHibernate делает это правильно).

Если вы не добавите свойства для идентификаторов внешнего ключа во все мои 100+ объектов, чтобы я мог получить доступ к их значениям без загрузки объектов, нужно ли что-либо сделать, чтобы избежать такого поведения?

EDIT: Кроме того, даже выполнение нулевой проверки приведет к загрузке объекта организации (не в NHibernate):

foreach(var user in db.Users)
    Console.WriteLine(user.Organization != null);

Я предполагаю, что это связано с фундаментальными различиями в том, как прокси-сервер объекта реализован в этих двух рамках. Поэтому мне придется приспособить весь свой код к этому новому разочаровывающему поведению ... Если кто-то уже не прошел через это и не мог просветить меня?

Популярные ответы

Нет, вам нужно добавить их как свойство в свой класс (то есть, если вы хотите, чтобы оно было напечатано строго), как это, чтобы получить к нему доступ напрямую.

public class User
{
    public int ID { get; set; }
    public string FullName { get; set; }

    //added ID    
    public int OrganizationID { get; set; }
    public virtual Organization Organization { get; set; }
    // [...]
}

Получив доступ к int вы предотвратите ленивую загрузку, EF свяжет идентификатор с помощью соглашений об именах. Сказав это: 100+ классов ...: |

ОБНОВИТЬ:

Как я только что понял; вы можете попробовать:

db.Users
        .Include("Organization.ID")
        .Where(/*your stuff*/) //etc.;

Я не уверен, что он полностью загрузит вложенное свойство. Если это не так, это может быть небольшое увеличение производительности.




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему