Entity Framework 6 Ленивая загрузка возвращает ноль

У меня есть класс со следующими свойствами

public class Booking
{
    public long BookingId {get;set;}
    public string RoomNumber {get;set;}
    [ForeignKey("BookingCustomer")]
    public long? BookingCustomerId {get;set;}

    public virtual Customer BookingCustomer {get;set;}
}

public class Customer
{
    public long CustomerId {get;set;}
    public string FirstName {get;set;}
}

если в методе, на который я ссылаюсь, свойства класса клиента получают исключение нулевой ссылки на объект, в то время как BookingCustomerId является populated.ie,

 hotel.BookingCustomerId=2

Например, строка customerFirstName = hotel.BookingCustomer.FirstName; если я заглядываю в отель. Покупаю клиента, я получаю нулевое значение. Как мне сделать эту Ленивую загрузку?

2 ответа

Ленивая загрузка подразумевает, что связанные объекты извлекаются при первом использовании метода получения этого объекта. В это же время выполняется запрос к базе данных для получения этого объекта, например Hotel.BookingCustomer.

Попробуйте проверить, действительно ли выполняется запрос, например, с помощью профилировщика Sql Server. Изучите запрос, чтобы убедиться, что все правильно

Если вы не видите, что запрос запущен, попробуйте его без виртуального ключевого слова (полная загрузка) и посмотрите, работает ли он тогда.

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

Похоже, вы используете аннотации данных для пометки свойств со свойствами, такими как внешние ключи. Вам также может понадобиться пометить первичные ключи атрибутом [key].

Вам также нужно будет добавить связанный объект бронирования в ваши данные клиента.

В качестве альтернативы вы можете свободно говорить API, чтобы сделать следующее в вашем контексте.

   // Configure the primary key for the Booking 
 modelBuilder.Entity<Booking>() 
.HasKey(t => t.BookingID); 

 modelBuilder.Entity<Booking>() 
.HasRequired(t => t.customer) 
.WithRequiredPrincipal(t => t.booking);

Больше о беглой картинке здесь: https://msdn.microsoft.com/en-us/data/jj591620.aspx

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