2015-06-05 2 views
1

У меня есть этот код, вызывающий исключение NullReferenceException. Я ожидал бы, что Lazy загрузится, чтобы начать с точки зрения оценки лямбды и перейти к базе данных, получающей навигационное свойство (последняя строка). Я решил это, используя Id напрямую, но мне любопытно, может ли кто-нибудь указать мне любую документацию, которая объясняет, что здесь происходит и почему это не работает.Linq Lambda и EF Lazy loading - NullReferenceException

  using (var context = new TestEntities()) 
      { 
       var entity = context.Entities.First(); 

       entity.NavigationPropertyId = 24; // This is a valid id, i.e. there is a record with Id 24 in the database 

       var otherEntity = context 
           .OtherEntities 
           .SingleOrDefault(x => 
            (x.NavigationPropertyId == entity.NavigationProperty.Id)); // << This raises the NullReferenceException 
      } 
+0

На одной строке вы 'entity.NavigationPropertyId =', 'позже entity.NavigationProperty.Id', т.е.' Id' становится свойством 'NavigationProperty' в второй случай. Является ли это опечаткой или причиной вашей проблемы? –

+0

Очевидно, что либо 'x' является' null', либо 'entity.NavigationProperty' является' null'. –

+0

Лассе, это не дубликат. Я знаю, что такое NullReferenceException. X не может быть нулевым, поскольку это предикат лямбда-выражения. Навигационная технология явно нулевая, но я ожидаю, что она будет ленивой, и, следовательно, мой вопрос. – Klaws86

ответ

0

Ну, много странных вещей

//with First, your entity could be almost anything, and it's NavigationProperty could perfectly be null. 
var entity = context.Entities.First(); 
//now you set its foreign key value ??? this won't affect an eventual navigation property, if you don't save the entity... 
entity.NavigationPropertyId = 24; 

Затем в SingleOrDefault, вы используете entity.NavigationProperty.Id, не entity.NavigationPropertyId => вы до сих пор не знаете, если предприятие имеет не нулевую NavigationProperty: это выглядеть это не => никакая ленивая загрузка не может быть сделана на что-то, что является нулевым ...

Я думаю, что это образец кода, но я бы пошел (конечно, было бы намного проще использовать 24 непосредственно во втором запрос, но вы можете захотеть ch Эк, если есть нечто существующее в Entities с этим значением)

var entity = context.Entities.FirstOrDefault(x => x.NavigationProperty != null && x.NavigationProperty.Id == 24); 

if (entity != null) { 
var otherEntity = context 
        .OtherEntities 
        .SingleOrDefault(x =>//Are your sure a FirstOrDefault is not enough ? 
         (x.NavigationPropertyId == entity.NavigationProperty.Id)); 
} 
+0

Это пример кода, я просто хотел доказать, что что-то подобное произошло в производстве. очевидно, это было более сложным, чем это, но это иллюстрирует суть. Ваша точка "теперь вы устанавливаете значение своего внешнего ключа ???, это не повлияет на возможное свойство навигации, если вы не сохраните объект", может быть ответом, который я искал. Я проверю, сохраняется ли объект в то же время. – Klaws86

+0

Отмечено как ответ, потому что объект не был сохранен. Спасибо что подметил это. – Klaws86