2013-08-09 3 views
5

ObjectContextは、生成されたエンティティへの汎用アクセスを可能にします。 DbContextにはこのようなサポートはありません。ジェネリックリポジトリを使用してEF5にアクセスすることは困難です。それをTEntity呼び出す、のは、私は一般的なメカニズムは、任意のエンティティを読みたいとしましょう: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; 
    } 
} 

使用

  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は、共通の基本型EntityObjectを持つクラスを生成するために使用されます。それはもはやケースですので、私はObjectSetDbSetからキャストを余儀なくされていますObjectContext.CreateObjectSet<>()の同等の機能がないため、私が持つことができる最高の制約は、class ...

セカンドではありません。

このパターンでは、DbContextは必要ありません。ジェネリックスがなければ、私はすべてのCRUD操作を手渡すように強制されます。私は何か見落としてますか?そうでない場合、代わりにObjectContextでコードを生成するようにEF5に指示できますか?

+1

を使用することですしているが、私はしばらく前にCodeProjectの上 HTTPを掲載このヒントを見て: //www.codeproject.com/Tips/309753/Repository-Pattern-with-Entity-Framework-4-1-and-C –

+0

@MassimilianoPeluso - はい、その記事は私が必要とするものです!あなたのサンプルのcontext.Set <>()はそれを行う新しい方法です。私はエンティティについても 'class'制約があることを知っています。コメントを回答として投稿したいのであれば、私は回答クレジットを与えます。 - –

答えて

8

私はしばらく前に

を投稿このtipを見ては、とにかくトリックは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); 
     } 
..... 
関連する問題