1

J'ai un un référentiel générique je tente d'ajouter une méthode GetById comme indiqué ici C# LINQ to SQL: Refactoring this Generic GetByID methoddépôt EF4 générique CTP5 getById

Le problème est mon dépôt n'utilise pas System.Data.Linq.DataContext à la place que j'utilise System.Data.Entity.DbContext

Je reçois des erreurs où je tente d'utiliser

Mapping.GetMetaType 

et

return _set.Where(whereExpression).Single(); 

Comment puis-je implémenter une méthode générique GetById dans CTP5? Devrais-je utiliser System.Data.Entity.DbContext dans mon Repository.

Voici le début de ma classe référentiel

public class BaseRepository<T> where T : class 
    { 

     private DbContext _context; 
     private readonly DbSet<T> _set; 

     public BaseRepository() 
     { 
      _context = new MyDBContext(); 
      _set = _context.Set<T>(); 

     } 

Répondre

9

L'approche la plus fondamentale est tout simplement

public T GetById(params object[] keys) 
{ 
    _set.Find(keys); 
} 

Si vous savez que toutes vos entités ont la clé primaire appelée Id (il n'a pas pour être appelé Id dans DB mais il doit être mappé à la propriété Id) de type défini, vous pouvez simplement utiliser ceci:

public interface IEntity 
{ 
    int Id { get; } 
} 

public class BaseRepository<T> where T : class, IEntity 
{ 
    ... 

    public T GetById(int id) 
    { 
    _set.Find(id); 
    } 
} 

Si le type de données ne sont pas toujours les mêmes, vous pouvez utiliser:

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

public class BaseRepository<TEntity, TKey> where TEntity : class, IEntity<TKey> 
{ 
    ... 

    public TEntity GetById(TKey id) 
    { 
    _set.Find(id); 
    } 
} 

Vous pouvez également utiliser simplement:

public class BaseRepository<TEntity, TKey> where TEntity : class 
{ 
    ... 

    public TEntity GetById(TKey id) 
    { 
    _set.Find(id); 
    } 
} 
+0

Excellent, merci pour expliquer les nombreuses approches. Ils semblent tous fonctionner correctement en dehors de _set.FindBy je ne peux pas trouver cette méthode sur System.Data.Entity.DBSet – Daveo

+0

Il est typo :) Il devrait être 'Find' –

+0

@Ladislav Mrnka: Dans votre premier exemple, où vous fournissez params object [] clés de la méthode GetById, Dans le cas où il y a 2 champs comme clés primaires, comment mappez-vous dans Rechercher chaque clé dans le champ concerné? – Naor

1

essayer cette

public virtual T GetByID(object id) 
    { 

     // Define the entity key values. 
     IEnumerable<KeyValuePair<string, object>> entityKeyValues = 
      new KeyValuePair<string, object>[] { 
      new KeyValuePair<string, object>("Id", id) }; 

     string qualifiedEntitySetName = _context.DefaultContainerName + "." + typeof(T).Name; 
     EntityKey key = new EntityKey(qualifiedEntitySetName, entityKeyValues); 

     return (T)_context.GetObjectByKey(key);   
    } 
Questions connexes