2

Un client a de nombreuses demandes ReservationRequest, un ReservationRequest ne compte qu'un seul client.Linq avec Entity Framework Eager Chargement

Disons que je récupère mon comme si demande de réservation

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

Je reçois ma question sans demande de réservation, mais quand je fais quelque chose comme ça.

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

Je reçois un

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; 

J'ai très peu d'expérience dans EF, mais ce genre de chose fonctionne dans NHibernate sans problème, que je manque un cadre quelque part dans EF?

Merci Jim

+0

Quelle version d'Entity Framework utilisez-vous? La dernière version prend en charge le chargement paresseux comme vous l'attendez, sinon vous devez écrire un peu plus de code. –

+0

Existe-t-il un moyen facile de vérifier? – jim

+0

Je vous suggère de changer la propriété de navigation de ReservationRequestSet "Clients" dans "Client". C'est plus redable. –

Répondre

5

Vous devez charger désireux explicitement la propriété de navigation Customers sur ReservationRequestSet:

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

A partir de 4 .NET, EF effectue le chargement paresseux par défaut, mais puisque vous développez une web application Je suggérerais de l'éteindre et d'utiliser toujours Eager Loading car il pourrait vouloir tenter un chargement paresseux lorsque le contexte de l'objet est fermé, donc provoquer une exception qui est un scénario très typique dans les applications Web et WCF.

+0

Vous êtes l'homme. – jim

+0

Pas de problème mec :) –

1

Si vous utilisez v1 Entity Framework, vous devez charger explicitement les enfants comme (pour charger après avoir récupéré l'entité):

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

Ou (à la charge désireux lorsque vous récupérez l'entité):

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

Si vous utilisez Entity Framework v4, vous pouvez essayer d'utiliser la nouvelle fonctionnalité Lazy-chargement:

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

Si vous suivez cette route, vous ne devriez pas avoir à vous soucier de charger explicitement les propriétés de navigation.

Questions connexes