web-dev-qa-db-fra.com

Pourquoi Entity Framework renvoie-t-il la liste null <> au lieu de celles vides?

Je suis assez nouveau dans le monde ASP .NET MVC. Peut-être que c'est la raison pour laquelle je ne peux pas m'expliquer la cause de ce qui est, pour moi, un problème agaçant.

J'ai un cours avec une relation un à plusieurs.

class MyClass{
    public List<OtherClass> otherClasses {get;set;}
}

Quand je persiste une instance de cette classe, je remplis sa relation avec une liste vide <>

MyClass myClass = new MyClass(){ otherClasses = new List<OtherClass>() }
context.myClass.Add(myClass);

Le problème est que, lorsque j'essaie de récupérer cette instance, et pour quelque raison que ce soit, j'essaie d'accéder à cette liste, le système me donne une exception de référence nulle ...

Ma question est la suivante: pourquoi EF ne renvoie-t-il pas les listes vides au lieu de listes vides? Surtout dans ce cas, que je le persiste avec une liste vide?

Il existe un moyen d'éviter de vérifier si les instances sont nulles?

27
igor.araujo

Votre entité devrait créer ces listes dans le constructeur. EF ne crée pas de collections dépendantes et s'attend à ce que l'entité le fasse.

Donc, votre cas, vous voudriez que votre entité ressemble à ceci:

class MyClass{ 
    public List<OtherClass> _otherClasses {get;set;} 

    public MyClass() {
        _otherClasses = new List<OtherClass>();
    }
} 
27
Erik Funkenbusch

Rendre la collection otherClasses virtuelle. Cela permettra à EF de charger la collection en différé.

class MyClass{
    public virtual List<OtherClass> otherClasses {get;set;}
}

Sinon, utilisez un chargement rapide avec la méthode Include.

context.myClass.Include(m => m.otherClasses).SingleOrDefault(m => m.Id == foo);
16
Eranga

Donc, si je comprends bien, vous ajoutez un List<OtherClass> vide au contexte, puis vous essayez de le récupérer.

J'imagine que vous devez réfléchir à la manière dont le contexte va suivre et interroger les entités qui sont dans son contexte. Ceci est généralement effectué par la Key de l'entité. Dans votre exemple, vous n'avez pas donné Key à l'entité. Par conséquent, le contexte n'a pas de handle sur l'entité.

Par conséquent, lorsque vous interrogez, le contexte ne trouve pas d'objet et renvoie null.

Si vous souhaitez initialiser une nouvelle entité, il est conseillé de lui attribuer au moins une Key (généralement la propriété Id), puis de sélectionner cette clé lors de votre recherche ultérieure.

J'espère que cela t'aides.

0
Davin Tryon