6

對於STE來說,更好的實現是什麼?我聽說DbContext是用EF實現Repo的最簡單方法,我個人利用EntityState,但在那裏ObjectContext上的任何成員是否可以使用Repo爲我的CRUD操作提供更多的功能性?今天我使用的是GenericRepository像這樣的:使用ObjectContext的倉庫實現與EF 4.1上的DbContext之間的區別

public class GenericRepository<TEntity> where TEntity : class 
    { 
     internal DbContext context; 
     internal DbSet<TEntity> dbSet; 

     public GenericRepository(DbContext context) 
     { 
      this.context = context; 
      this.dbSet = context.Set<TEntity>(); 
     } 

     public virtual IEnumerable<TEntity> Get(
      Expression<Func<TEntity, bool>> filter = null, 
      Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, 
      string includeProperties = "") 
     { 
      IQueryable<TEntity> query = dbSet; 

      if (filter != null) 
      { 
       query = query.Where(filter); 
      } 

      foreach (var includeProperty in includeProperties.Split 
       (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
      { 
       query = query.Include(includeProperty); 
      } 

      if (orderBy != null) 
      { 
       return orderBy(query).ToList(); 
      } 
      else 
      { 
       return query.ToList(); 
      } 
     } 

     public virtual TEntity GetByID(object id) 
     { 
      return dbSet.Find(id); 
     } 

     public virtual void Insert(TEntity entity) 
     { 
      dbSet.Add(entity); 
     } 

     public virtual void Delete(object id) 
     { 
      TEntity entityToDelete = dbSet.Find(id); 
      Delete(entityToDelete); 
     } 

     public virtual void Delete(TEntity entityToDelete) 
     { 
      if (context.Entry(entityToDelete).State == EntityState.Detached) 
      { 
       dbSet.Attach(entityToDelete); 
      } 
      dbSet.Remove(entityToDelete); 
     } 

     public virtual void Update(TEntity entityToUpdate) 
     { 
      dbSet.Attach(entityToUpdate); 
      context.Entry(entityToUpdate).State = EntityState.Modified; 
     } 

     public virtual IEnumerable<TEntity> GetWithRawSql(string query, params object[] parameters) 
     { 
      return dbSet.SqlQuery(query, parameters).ToList(); 
     } 
    } 

我忘了,更不用說還我使用的統一,所以庫的調用是這樣的方式:

[Dependency] 
     public IUnityContainer Container { get; set; } 

     public List<Case> GetAll() 
     { 
      using (var context = Container.Resolve<ClaimEntities>()) 
      { 
       var qry = (from c in context.Cases 
          select c).ToList(); 
       return qry; 
      } 
     } 

回答

4

自我跟蹤實體是ObjectContext的特徵 - 它們是not supported in DbContext。如果您想要STE,您需要交換到ObjectContext API並使用STE T4模板來生成實體,而不是當前的POCO。

相關問題