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。

相关问题