EntityException levée lors de l'exécution d'une requête EF6 avec .Includes ()

c# entity-framework entity-framework-6

Question

Je ne parviens pas à migrer une solution EF4 vers EF6.

Nous utilisons des modèles T4 pour générer des POCO ignorants persistants dotés de propriétés de navigation basées sur ObservableCollection <T>.

Étant donné que notre implémentation ObjectContext expose des ensembles d'entités sous la forme IObjectSet <entity>, nous perdons la méthode Include () d'ObjectQuery. Nous devons donc utiliser une méthode d'extension sur IQueryable pour la récupérer, comme suit:

public static IQueryable<TSource> Include<TSource>(this IQueryable<TSource> source, string path)
{
    IQueryable<TSource> returnValue = source;
    var objectQuery = source as ObjectQuery<TSource>;

    if (objectQuery != null)
    {
        returnValue = objectQuery.Include(path);
    }

    return returnValue;
}

Après avoir mis à jour la solution pour utiliser EF6, nous voyons maintenant l’exception System.Data.Entity.Core.EntityException suivante lors de l’exécution de requêtes à l’aide de .Include (): -

"La propriété de navigation 'Détails' sur l'entité de type 'DataEntities.Parent' doit implémenter ICollection <T> pour qu'Entity Framework puisse suivre les modifications apportées aux collections."

Ce que je ne comprends pas, c'est que la propriété 'Détails' est un type personnalisé qui hérite de ObservableCollection <T> qui est une ICollection <T>, alors pourquoi l'exception qui stipule qu'elle doit implémenter ICollection <T>?

Si quelqu'un a des éclaircissements à ce sujet, je vous en serais reconnaissant, merci.

Réponse populaire

Comme expliqué dans cet article de blog d'un membre de l'équipe EF

Les règles que vos classes doivent suivre pour activer les mandataires de suivi des modifications sont assez strictes et restrictives. Cela limite la manière dont vous pouvez définir vos entités et empêche l'utilisation d'éléments tels que des propriétés privées ou même des setters privés.

Les règles sont:

  • La classe doit être publique et non scellée.
  • Toutes les propriétés doivent avoir des getters et des setters virtuels publics / protégés.
  • Les propriétés de navigation de la collection doivent être déclarées comme ICollection. Ils ne peuvent pas être IList, List, HashSet, etc.

Et cette réponse vous explique pourquoi vous ne pouvez pas utiliser votre implémentation.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi