2013-08-09 50 views
5

ObjectContext cho phép truy cập chung vào các Thực thể được tạo. DbContext dường như không có hỗ trợ như vậy. Việc truy cập EF5 với một kho lưu trữ chung là một thách thức. Hãy nói rằng tôi muốn có một cơ chế chung để đọc bất kỳ thực thể nào đó, gọi nó là TEntity:Quyền truy cập chung vào 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; 
    } 
} 

Cách sử dụng

  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 sử dụng để tạo ra các lớp học với một loại cơ sở chung EntityObject. Vì đó không còn là trường hợp hạn chế tốt nhất mà tôi có thể có là class ...

Thứ hai, vì không có tương đương ObjectContext.CreateObjectSet<>() Tôi bị buộc phải bỏ từ DbSet đến ObjectSet.

Với mẫu này tại chỗ tôi không cần DbContext. Nếu không có generics tôi buộc phải tay mã tất cả các hoạt động CRUD. Tôi đã bỏ lỡ một cái gì đó? Nếu không, có thể nói với EF5 để tạo mã với ObjectContext thay thế?

+1

có một cái nhìn tại mẹo này mà tôi được đăng trên CodeProject một thời gian trước http: //www.codeproject.com/Tips/309753/Repository-Pattern-with-Entity-Framework-4-1-and-C –

+0

@MassimilianoPeluso - Có bài viết đó chính xác là những gì tôi cần! Mỗi bối cảnh ví dụ của bạn.Set <>() là cách mới để làm điều đó. Tôi thấy bạn cũng có ràng buộc 'class' trên Entities. Nếu bạn muốn đăng bình luận như câu trả lời tôi sẽ trả lời tín dụng. - - –

Trả lời

8

có một cái nhìn tại tip này mà tôi đăng tải một thời gian trước

Dù sao Bí quyết là bằng cách sử dụng 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); 
     } 
..... 
Các vấn đề liên quan