2010-06-11 27 views
4

J'utilise Visual Studio 2010 avec .NET 4 et Entity Framework 4. Je travaille avec les classes POCO et non avec le générateur EF4. Je dois remplacer les méthodes Equals() et GetHashCode(), mais cela ne fonctionne pas vraiment. Je pensais que c'était quelque chose que tout le monde fait, mais je ne trouve rien sur le problème en ligne. Quand j'écris mes propres classes et la méthode Equals, j'utilise Equals() des propriétés, qui doivent être chargées par EF à remplir. Comme ceci:Entity Framework 4 écraser Equals et GetHashCode d'une propriété de classe

public class Item 
{ 
    public virtual int Id { get; set; } 
    public virtual String Name { get; set; } 

    public virtual List<UserItem> UserItems { get; set; } 
    public virtual ItemType ItemType { get; set; } 

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

     return item.Name.Equals(this.Name) 
      && item.ItemType.Equals(this.ItemType); 
    } 

    public override int GetHashCode() 
    { 
     return this.Name.GetHashCode()^this.ItemType.GetHashCode(); 
    } 
} 

Ce code ne fonctionne pas. Les problèmes sont dans Equals et GetHashCode où j'essaye d'obtenir HashCode ou Equal de ItemType. Chaque fois, j'obtiens une exception NullRefernceException si j'essaie d'obtenir des données par Linq2Entites.

Une façon sale de le réparer est de capturer le NullReferenceException et le retour false (par Equals) et retour base.GetHashCode() (par GethashCode), mais je l'espère, il y a une meilleure façon de résoudre ce problème.

J'ai écrit un petit projet de test, avec SQL Script pour le domaine DB et POCO, le fichier EDMX et la méthode principale de test de console. Vous pouvez le télécharger ici: Download

Répondre

0

Vous utilisez des classes POCO pure sans génération de proxy. Dans ce cas, le chargement différé n'est pas pris en charge et vous devrez créer des méthodes de référentiel pour charger vous-même les entités associées. C'est pourquoi votre entité ItemType est nulle (et le sera toujours).

Si vous souhaitez un chargement paresseux, vous pouvez utiliser le générateur EF pour créer des classes POCO prenant en charge le chargement paresseux.

+0

Le chargement paresseux fonctionne, si je supprime Equals/GetHashCode ou attrape l'exception NullReferenceException – Zhok