2011-03-27 4 views
1

Je suis en train d'écrire la méthode pour aller chercher des entités uniques par leur ID:Entity Framework 4 - Méthode générique pour récupérer l'entité par ID

public Customer GetCustomer(int i_CustomerID) 
{ 
    return (from c in context.CustomerSet 
     where c.Id == i_CustomerID 
     select c).SingleOrDefault();    
} 

public Movie GetMovie(int i_MovieID) 
{ 
    return (from m in context.MovieSet 
     where m.Id == i_MovieID 
     select m).SingleOrDefault(); 
} 

Mais j'ai de nombreuses entités et ce code se répète. Je veux écrire une méthode comme ceci:

public T GetEntityByID<T>(int i_EntityID) 
{ 
    return (from e in context.T_Set 
     where e.Id == i_EntityID 
     select e).SingleOrDefault(); 
} 

Y a-t-il un moyen d'y parvenir?

+0

Vous pouvez trouver une question similaire [ici] (http://stackoverflow.com/questions/248682/create-llblgen-linq-query-dynamicly-with-strings) – Menahem

Répondre

3

Je n'ai pas fait exécuter cela, mais il compile et est probablement quelque chose le long des lignes de ce que vous essayez d'atteindre:

public static void Testing() 
    { 
     SelectEntity<MyObject>(r => r.MyObjectId == 1); 
    } 

    public static T SelectEntity<T>(Expression<Func<T, bool>> expression) where T : EntityObject 
    { 
     MyContext db = new MyContext(); 
     return db.CreateObjectSet<T>().SingleOrDefault(expression); 
    } 
+0

C'est une bonne solution, mais n'aime pas l'idée d'utiliser le lambda. Voudrait en quelque sorte juste donner un int. –

+0

Vous pouvez déclarer une seconde classe partielle pour vos entités qui implémente une interface (par exemple IPrimaryKey) qui connecte la clé primaire à MyEntity.PrimaryId, puis rend votre méthode générique où T: IPrimaryKey. Avez-vous envisagé d'essayer d'utiliser EntityKey? Je pense qu'il pourrait être possible de déterrer la clé primaire à partir de l'information clé de l'entité ... – Rob

1

Le problème est qu'il n'existe aucun super-type commun qui possède les propriétés pertinentes que vous recherchez. Il est toutefois facile de générer vos méthodes de récupération à l'aide de l'outil de génération de code T4 intégré que EF utilise. Voici un bon lien sur la façon de vous connecter et de générer le type de code dont vous avez besoin.

http://msdn.microsoft.com/en-us/data/gg558520

0

Si vous savez que votre référentiel générique sera toujours utilisé avec les types d'entités qui ont PK avec le même nom et le même type que vous pouvez simplement définir l'interface comme ceci:

public interface IEntity 
{ 
    int Id { get; } 
} 

une d soit implémenter cette interface dans une partie partielle de vos entités générées, soit modifier le modèle T4 pour l'inclure automatiquement. Votre dépôt sera alors défini comme:

public interface IRepository<TEntity> where T : IEntity 
{ 
    ... 
} 

Si le type de PK peut changer, mais le nom est toujours le même, vous pouvez améliorer l'interface entité:

public interface IEntity<TKey> 
{ 
    TKey Id { get; set; } 
} 

et la définition du référentiel sera être:

public interface IRepository<TEntity, TKey> where TEntity : IEntity<TKey> 
{ 
    ... 
} 

Si vous voulez référentiel générique qui est capable de travailler avec des entités avec le nom de PK différents et tapez vérifier this answer. Cette solution devrait probablement aussi fonctionner (ou avec une petite modification) avec des PK composites.

+0

Cela ressemble à beaucoup de travail pour économiser du travail :-) –

+0

Je ne comprenais pas pourquoi ai-je besoin d'IRepository? comment l'utiliser? –

+0

Le référentiel est un modèle utilisé pour extraire la couche de données. Si vous y réfléchissez, il fait la même chose que DBContext. – Burt

Questions connexes