2013-08-09 16 views
5

ObjectContext umożliwia ogólny dostęp do wygenerowanych elementów. DbContext wydaje się nie mieć takiego wsparcia. Dostęp do EF5 z ogólnym repozytorium stanowi wyzwanie. Powiedzmy, że chcę mechanizm rodzajowy czytać każdą daną jednostkę, nazwać TEntity:Ogólny dostęp do 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; 
    } 
} 

Wykorzystanie

  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 wykorzystywane do generowania klas z typu common bazowym EntityObject. Jako że nie jest to już sprawa najlepszy Ograniczenie może mam to class ...

Po drugie, ponieważ nie ma odpowiednika ObjectContext.CreateObjectSet<>() jestem zmuszony do oddania od DbSet do ObjectSet.

Przy tym wzorze na miejscu nie potrzebuję DbContext. Bez leków generycznych jestem zmuszony do zakodowania wszystkich operacji CRUD. Przegapiłem coś? Jeśli nie, czy można powiedzieć EF5, aby wygenerował kod z numerem ObjectContext?

+1

przyjrzeć się tej końcówki, które napisałem na CodeProject jakiś czas temu http: //www.codeproject.com/Tips/309753/Repository-Pattern-with-Entity-Framework-4-1-and-C –

+0

@MassimilianoPeluso - Tak, ten artykuł jest dokładnie tym, czego potrzebuję! Na twój przykładowy kontekst. Ustaw <>() to nowy sposób na zrobienie tego. Widzę, że jesteś również z ograniczeniem "klasy" w jednostkach. Jeśli chcesz opublikować komentarz jako odpowiedź, udzielę mu odpowiedzi. - –

Odpowiedz

8

przyjrzeć się tej tip że napisałem jakiś czas temu

Zresztą Sztuką jest za pomocą 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); 
     } 
.....