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
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
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