2009-09-26 5 views
6

J'utilise modèle de référentiel générique avec des méthodes:Entity Framework et problème modèle référentiel

private ObjectQuery<T> ObjectQueryList() 
    { 
     var list = CamelTrapEntities.CreateQuery<T>(EntitySetName); 
     return list; 
    } 

public IQueryable<T> List() 
    { 
     return ObjectQueryList(); 
    } 

Liste Metod() retourne IQueryable < T >, becase IQueryable < T > est facile de se moquer. J'ai aussi méthode d'extension:

public static IQueryable<T> Include<T>(this IQueryable<T> obj, string path) 
    { 
     if (obj is ObjectQuery<T>) 
      (obj as ObjectQuery<T>).Include(path); 

     return obj; 
    } 

Cette méthode est utilisée en dehors du référentiel pour obtenir la liste des entités ayant des propriétés de navigation déjà chargés, par exemple: List.Include (« CreatedBy »). Le problème est que cela ne fonctionne pas. Tous les éléments sont ignorés. quand je change de méthode Liste() pour

public ObjectQuery<T> List() 
    { 
     return ObjectQueryList(); 
    } 

tout fonctionne bien.

Comment dois-je implémenter le modèle de référentiel pour pouvoir exécuter des requêtes plus complexes?

Répondre

6

réflecteur m'a donné une réponse:

public ObjectQuery<T> Include(string path) 
{ 
    EntityUtil.CheckStringArgument(path, "path"); 
    return new ObjectQuery<T>(base.QueryState.Include<T>((ObjectQuery<T>) this, path)); 
} 

Inclure les retours nouvel objet ObjectQuery et ma fonction Inclure retourné ancien objet. Changement de

public static IQueryable<T> Include<T>(this IQueryable<T> obj, string path) 
{ 
    if (obj is ObjectQuery<T>) 
     return (obj as ObjectQuery<T>).Include(path); 

    return obj; 
} 

a résolu le problème. Quelques heures perdues et je déteste Entity Framework plus :)

Il m'a fait également réaliser que je devrais créer une autre fonction de liste avec le paramètre d'inclusion et ne pas permettre de faire inclut le référentiel extérieur.

1

Here est l'implémentation de modèle de Repository la plus complète que j'ai vu pour EF. Je ne peux pas dire avec certitude si cela vous permettra de faire Include(), mais si je lis bien la mise en œuvre, il devrait le faire.

1

Avec EntityFramework 4.1, DbExtensions (System.Data.Entity.DbExtensions) résout ce problème, et ajoute nativement à la fois .Include([string path]) et .Include([property expression]) pour tout IQueryable<T>. Assurez-vous que le projet utilisant votre référentiel fait référence à EntityFramework et, comme pour toute méthode d'extension, spécifiez using System.Data.Entity; dans votre fichier de classe pour accéder à ces extensions.

Questions connexes