2011-08-05 2 views
0

Entity Framework a radicalement changé depuis l'introduction de la version 1. EF 4.1 a amélioré les mappages Code First et Fluent qui sont vraiment impressionnants. Cependant, je m'inquiète des implémentations de requêtes complexes sur EF 4.1 car cela dépend fortement de DbContext. Entity SQL et Linq to Entities continuent à changer son comportement avec les requêtes SQL. Je pense que nous avons besoin d'un mécanisme de requête fort comme HQL ou des critères pour surmonter cela. Ce que tu penses ?Implémentation du référentiel générique Entity Framework avec IQuarable

Répondre

1

De nombreux ORM .NET modernes fournissent une implémentation IQueryProvider (y compris NHibernate). Je choisis de supprimer la dépendance directe sur EF en utilisant le modèle POCO T4, puis en le modifiant pour générer une interface (IMyRepository) qui renvoie des IQueryables simples au lieu de ObjectSets. L'implémentation sous-jacente de IMyRepository en utilisant un ObjectContext. Si nous décidons de nous éloigner de EntityFramework, nous pouvons simplement changer l'implémentation de IMyRepository pour utiliser LINQ IQueryProvider de quelqu'un d'autre. En outre, cela nous permet de travailler dans un scénario distribué. Par exemple, une implémentation de IMyRepository réside sur le client et utilise DataServiceClient (WCF Data Services) pour appeler le serveur, qui a une implémentation différente de IMyRepository, qui utilise directement Entity Framework.

Dans le cas du code d'abord, c'est également assez facile à faire. Vos classes sont déjà des POCOs ... donc faites que votre DbContext implémente une interface qui retourne IQueryables au lieu de DbSets.

Personnellement, j'injecte ensuite IMyRepository en utilisant l'injection de dépendance.

+0

Cependant, par exemple, si l'on veut se joindre à une requête avec deux Poços alors que nous voulons utiliser DbContext dans un référentiel. n'est-ce pas? – marvelTracker

+0

Je ne comprends pas pourquoi cela ferait une différence? de i dans repo.MyEntity1s de j dans repo.MyEntity2s .... etc. – Jeff

+0

Oui. Je l'ai maintenant. Merci pour l'explication. Je suis d'accord avec la mise en œuvre IQuerable nous devons fournir l'implémentation suivante et la méthode distincte pour le type de chargement comme suit. – marvelTracker

0

Mon dépôt générique Ressemble suit

public class Repository<TEntity, TPrimaryKey>: IRepository<TEntity, TPrimaryKey> where TEntity : class 
{ 
    public IQueryable<TEntity> GetQuery() 
    { 
     return this.UnitOfWork.GetQuery<TEntity>(); 
    }  
    public IQueryable<T> LoadType<T>() where T : class 
    { 
     return this.UnitOfWork.GetQuery<T>(); 
    } 
} 

Et Mon unité de travail va ici

public class UnitOfWork 
{ 
    /// <summary> 
    /// Gets the query. 
    /// </summary> 
    /// <typeparam name="TEntity">The type of the entity.</typeparam> 
    /// <returns></returns> 
    public IQueryable<TEntity> GetQuery<TEntity>() where TEntity:class 
    { 
     return this.DbContext.Set<TEntity>(); 
    }   
} 
Questions connexes