Linq с Entity Framework нетерпеливо загружается - PullRequest
2 голосов
/ 01 ноября 2010

У Заказчика есть много ReservationRequest, у ReservationRequest есть только один Клиент.

Допустим, я получаю свой ReservationRequest следующим образом:

var c = dataContext.ReservationRequestSet.FirstOrDefault(i => i.id == RequestId);

Я получаю свой ReservationRequest без проблем, но когда я делаю что-то подобное.

        if (c != null)
        {
            int id = c.Customers.id;

Я получаю

    Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

Line 75:             if (c != null)
Line 76:             {
Line 77:                 int id = c.Customers.id;

У меня очень мало опыта в EF, но этот тип вещей работает в nHibernate без проблем, я пропускаю настройки где-то в EF?

Спасибо, Джим

Ответы [ 2 ]

5 голосов
/ 01 ноября 2010

Вам необходимо явно загрузить свойство навигации Customers в ReservationRequestSet:

var c = dataContext.ReservationRequestSet.Include("Customers")
                                         .FirstOrDefault(i => i.id == RequestId);

Начиная с .NET 4, EF выполняет отложенную загрузку по умолчанию, но, поскольку вы разрабатываете веб-приложение, я бы посоветовал отключить его и всегда использовать ускоренную загрузку, так как он может попытаться выполнить отложенную загрузку, когда контекст вашего объекта закрыто, поэтому вызывает исключение, которое является очень типичным сценарием в приложениях Web и WCF.

1 голос
/ 01 ноября 2010

Если вы используете Entity Framework v1, вы должны явно загружать дочерние элементы, например (для загрузки после извлечения сущности):

if(!c.CustomersReference.IsLoaded)
    c.CustomersReference.Load();

или (для загрузки при извлечении сущности):

var c = dataContext.ReservationRequestSet
                   .Include("Customers")
                   .FirstOrDefault(i => i.id == RequestId);

Если вы используете Entity Framework v4, вы можете попробовать использовать новую функцию отложенной загрузки:

using(YourContext db = new YourContext())
{
    db.ContextOptions.LazyLoadingEnabled = true;
    // query here
}

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

...