2009-11-10 7 views
1

Je trouve que je répète des bits de code comme ceci encore et encore tout en utilisant ADO.NET Entity Framework.ADO.NET Entity Framework IsLoaded et Load

VB:

' Load the thing if not already loaded. ' 
If Not Something.Thing.IsLoaded Then 
    Something.Thing.Load() 
End If 

C#:

// Load the thing if not already loaded. 
if (!Something.Thing.IsLoaded) 
{ 
    Something.Thing.Load(); 
} 

Est-ce normal? Dois-je utiliser IsLoaded et Load si souvent? Ou est-ce que je ne l'utilise pas correctement?

+1

Ne pas avoir le chargement paresseux était l'un des problèmes avec les gens avaient cadre de l'entité. – Min

Répondre

1

Si vous chargez par exemple une liste de 7 clients et que vous chargez les commandes pour chacun des clients.

Si vous le faites en chargeant les clients, puis en bouclant à travers chaque client, vérifier si les commandes sont chargées et ensuite les charger. vous obtiendrez 8 (1 + 7) appels à la base de données. Si vous utilisez à la place Include ("Orders") lors de l'obtention des clients, il n'y aura pas de boucle, pas d'instruction if, et un seul appel à la base de données.

Entity Framework 4 aura un chargement différé.

+1

L'utilisation de Include ne garantit pas que vous n'obtiendrez toujours pas 8 appels à la base de données. –

4

En fonction de la manière dont vous appelez l'objet (référentiel par exemple), vous pouvez utiliser la méthode "Include()" sur l'ensemble de base d'entité.

 return EntitiesObject.Something.Include("Thing").Where(x=>x.ID == ID) 

Cela retournerait le (s) objet (s) avec "Thing" déjà chargé.

Voici un bon article à ce sujet:

http://msdn.microsoft.com/en-us/library/bb896272.aspx

+1

Inclure ne force rien à charger. Vous devez toujours appeler IsLoaded et Load après avoir utilisé Include si vous voulez vous assurer qu'il est chargé. Inclure devrait "hâte" charger les choses, mais c'est un indice seulement. –

1

Je fais écho ce que Shiraz a dit. De plus, je me retrouve souvent à implémenter un chargement paresseux en enveloppant la propriété générée par EF dans une classe partielle. Voici un exemple:

public partial class Customer 
{ 
     public EntityCollection<Order> CustomerOrders 
     { 
      get 
      { 
       if (!Orders.IsLoaded) 
        Orders.Load(); 

       return Orders; 
      } 
     } 
} 

Enregistre une certaine répétition du côté appelant.

4

La version de EntityFramework dans le VS2010 beta est beaucoup, beaucoup plus amicale à cet égard. Cela dit, si vous êtes coincé avec la version sans chargement paresseux, cette méthode d'extension peut vous aider:

public static T EnsureLoaded<T>(this EntityReference<T> eRef) where T: class, IEntityWithRelationships 
{ 
    if (!eRef.IsLoaded) 
     eRef.Load(); 

    return eRef.Value; 
} 

Ensuite, en supposant que vous avez des objets utilisateur qui ont des contacts, vous pouvez faire:

Contact c = User.ContactReference.EnsureLoaded(); 

Il est encore assez sucky, mais je trouve préférable d'écrire cette Isloaded if instruction encore et encore.

+0

Voir aussi la réponse de Proviste. –

1

C'est tout à fait normal et attendu. Cela rend l'optimisation des performances difficile. Malheureusement, l'instruction Include nécessite toujours que IsLoaded et Load soient appelés par la suite si vous voulez vous assurer que vos objets ont été chargés.

1

j'ai étendu tclem solution pour les relations 1-n:

public static EntityCollection<T> EnsureLoaded<T>(this EntityCollection<T> eRef) where T : class, IEntityWithRelationships 
{ 
    if (!eRef.IsLoaded) 
     eRef.Load(); 

    return eRef; 
} 
Questions connexes