2010-12-13 9 views
2

J'utilise Entity Framework 4 et j'ai quelques problèmes avec le chargement paresseux. J'ai 3 entités et chacune est contenue l'une dans l'autre. CarSetup contiendra une entité Car qui contiendra une entité Event. Ils sont tous paresseux chargés.Problème avec Entity Framework et chargement paresseux

J'ai créé un test unitaire simpliste pour reproduire le problème.

CarSetup carSetup = carSetupContext.CreateObject<CarSetup>(); 
Car car = Load("car1"); 
carSetup.Car = car; 

Je reçois un plantage lorsque j'assigne la voiture à l'objet carsetup. Il se bloque réellement dans la méthode Equals de l'entité Car.

public override bool Equals(object obj) 
{ 
    if(obj == null) 
    { 
     return false; 
    } 

    return this.Event.Equals(((Car)obj).Event); 
} 

Si j'Espion l'entité avant la méthode equals est appelée, toutes les entités sous-chargées et obtenir le problème ne se produit pas. Lorsque j'assigne la voiture existante à la configuration de la voiture, l'infrastructure charge tous les CarSetup existants pour cette voiture et appelle ma méthode "Equals" avec eux. Cependant, puisque le chargement paresseux est activé, l'événement dans la voiture est nul, ce qui est normal. Lorsqu'il essaie d'accéder à la propriété Event, aucun chargement ne se produit et il se bloque. J'ai vérifié la propriété "this" dans la méthode equals et elle est de type "System.Data.Entity.DynamicProxies.Car". J'ai également vérifié et le guide EventId est correctement défini dans l'entité de voiture.

Quelqu'un at-il une idée de ce qui se passe?

EDIT: Après avoir fait un peu plus de tests, si je l'appelle ma méthode equals manualy:

car.Equals(car); 

Tout fonctionne parfaitement. Cela se produit uniquement lorsque Entity Framework décide de charger des relations et appelle automatiquement la méthode Equals.

Merci

+0

Il y a quelque chose de mal avec votre crochets en retour ... de la méthode Equals. Probablement seulement une faute de frappe, puisque cela ne compile même pas et ne peut pas être la raison de votre problème. – Slauma

+0

Merci d'avoir signalé cela. Mon entité est un peu plus complexe, donc je l'ai rayé pour la question n'a pas vraiment remarqué l'erreur. – autoexec

Répondre

0

Il semble que le Event n'est pas chargé. De mémoire, je l'aurais fait quelque chose comme ça pour faire en sorte que les événements sont chargés avec les voitures:

context.Cars.Include("Events"); 

Vous utilisez une syntaxe que je ne connais pas bien, mais regardez dans l'opérateur Include.

+0

Pour la syntaxe, la partie de chargement était juste un exemple. Si j'ajoute le "Include" à ma requête de sélection, cela ne va-t-il pas à l'encontre du but du chargement paresseux puisque l'événement entier sera chargé dans la requête initiale? Mon chargement paresseux fonctionne pour l'événement si j'essaie d'accéder à cette propriété après un chargement. C'est seulement dans ce scénario "égal" que cela ne semble pas fonctionner. – autoexec

0

Vous semblez utiliser des objets POCO avec DynamicProxies activés dans votre contexte d'objet, n'est-ce pas? Il est possible que, en transposant obj en Car dans votre remplacement Equals, vous transtypiez dans votre classe POCO et non en System.Data.Entity.DynamicProxies.Car qui est dérivé dynamiquement de Car. Avec cette distribution, vous supprimez effectivement la capacité de obj (qui est probablement aussi de type System.Data.Entity.DynamicProxies.Car comme this) pour charger paresseusement les propriétés de navigation. (Parce que c'est le DynamicProxy qui permet le chargement à des entités POCO.)

Maintenant, le problème est que vous ne pouvez pas jeter à System.Data.Entity.DynamicProxies.Car au lieu de Car puisque ce type n'existe pas au moment de la compilation et est uniquement généré dynamiquement lors de l'exécution . Mais si vous utilisez C# 4.0 (Visual Studio 2010), vous pouvez essayer d'utiliser le typage dynamique avec le nouveau mot-clé dynamic.Votre Equals override ressemblerait à ceci:

public override bool Equals(object obj) 
{ 
    if(obj == null) 
    { 
     return false; 
    } 

    dynamic o = obj; 

    return this.Event.Equals(o.Event); 
} 

(.. Tout cela est un coup de feu dans l'obscurité et je n'ai pas testé rien Mais il est peut-être la peine d'essayer)

+0

Merci pour votre réponse. Ça valait le coup mais j'ai le même problème. En fait, le problème est plus grand que cela, car "cet" objet voiture et l'objet obj voiture transmis à la fonction sont tous les deux DynamicProxies et les deux ont la propriété Event null. J'ai ajouté un commentaire à mon message initial après avoir fait un peu plus de tests. Le scénario semble se produire uniquement lorsque le framework appelle ma méthode Equals. Cela fonctionne bien quand je l'appelle manuellement. – autoexec

+0

Oui, je m'attendais aussi à ce que 'obj' soit un DynamicProxy. Mais il semble alors que ces proxys ne chargent pas les propriétés de navigation lorsque EF appelle la méthode Equals. Hm, je n'en ai plus aucune idée. Peut-être que c'est une bonne idée de poser à nouveau votre question sur le MS Dev-Center pour EF: http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/threads, peut-être avec un lien vers ce fil ici. – Slauma

Questions connexes