2013-08-09 11 views
5

ObjectContext consente l'accesso generico alle Entità generate. DbContext sembra non avere tale supporto. L'accesso a EF5 con un repository generico è impegnativo. Diciamo che voglio un meccanismo generico per leggere un dato soggetto, lo chiamano TEntity:Accesso generico a DbContext

public class DataRepositoryEF5<T> where T: DbContext 
{ 
    private ObjectContext _context;   

    public DataRepositoryEF5(DbContext context) 
    { 
     _context = ((IObjectContextAdapter)context).ObjectContext; 
    } 

    public IEnumerable<TEntity> ReadAll<TEntity>() where TEntity : class,new() 
    { 
     return GetObjectSet<TEntity>().AsEnumerable(); 
    } 

    protected ObjectSet<TEntity> GetObjectSet<TEntity>() where TEntity : class,new() 
    { 
     ObjectSet<TEntity> result; 
     result = _context.CreateObjectSet<TEntity>(); 
     return result; 
    } 
} 

Uso

  var context = new MyContext();    
      var repository = new DataRepositoryEF5<MyContext>(context); 

      IEnumerable<Document> results = repository.GetAll<Document>(); 

      foreach (var item in results) 
      { 
       Console.WriteLine("{0} {1} {2} {3}", item.Description, item.Id, item.Property, item.Whatever); 
      } 

EF usato per generare le classi con un tipo di base comune EntityObject. Dal momento che non è più il caso il vincolo migliore che posso avere è class ...

In secondo luogo, perché non esiste un equivalente di ObjectContext.CreateObjectSet<>() sono costretto a lanciare DbSet-ObjectSet.

Con questo modello sul posto non ho bisogno di DbContext. Senza generici sono costretto a gestire il codice di tutte le operazioni CRUD. Ho dimenticato qualcosa? In caso contrario, è possibile indicare a EF5 di generare codice con ObjectContext?

+1

un'occhiata a questo suggerimento che ho postato su CodeProject qualche tempo fa http: //www.codeproject.com/Tips/309753/Repository-Pattern-with-Entity-Framework-4-1-and-C –

+0

@MassimilianoPeluso - Sì, quell'articolo è esattamente ciò di cui ho bisogno! Per il tuo esempio context.Set <>() è il nuovo modo di farlo. Vedo che sei anche con un vincolo 'class' sulle Entities. Se vuoi postare il commento come risposta darò risposta a credito. - –

risposta

8

un'occhiata a questo tip che ho postato qualche tempo fa

In ogni caso il trucco è quello di utilizzare context.Set<>

public interface IEntity 
     { 
      int Id { get; set; } 
     } 

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity 
    { 
     private IDbContext _context; 
     public Repository(IDbContext context) 
     { 
      _context = context; 
     } 
      private IDbSet<TEntity> DbSet 
     { 
      get 
      { 
       return _context.Set<TEntity>(); 
      } 
     } 
      public IQueryable<TEntity> GetAll() 
      { 
      return DbSet.AsQueryable(); 
      } 
     public void Delete(TEntity entity) 
     { 
      DbSet.Remove(entity); 
     } 
.....