Web API实体框架工作单元&存储过程的存储库

时间:2013-05-07 14:52:28

标签: .net entity-framework repository unit-of-work asp.net-web-api

我有一个Generic Repository和UoW,我是根据Dykstra先生的圣经帐户http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application建模的。

namespace Bookstore.DAL
{
    public class GenericRepository<TEntity> where TEntity : class
    {
        internal BookstoreContext context;
        internal DbSet<TEntity> dbSet;

        public GenericRepository(BookstoreContext context)
        {
            this.context = context;
            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);
            }

            query = includeProperties.Split(new[] {','},
                StringSplitOptions.RemoveEmptyEntries).
                Aggregate(query, (current, includeProperty) => current.Include(includeProperty));

            return orderBy != null ? orderBy(query).ToList() : 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)
        {
            var 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;
        }
    }
}

我需要做的是覆盖insert方法以使用我在上下文类中定义的存储过程。我可以轻松地绕过UoW并构建一个直接从上下文中消耗SP的控制器,但这不会是最佳的。

我的问题是: 如何覆盖方法以使用在上下文中定义的存储过程?

1 个答案:

答案 0 :(得分:1)

您实际上不必覆盖该级别的EF行为。 EF存储库的行为仍然是“添加”到实体集合。

您想要更改的是“实体”的添加方式。 This article解释了如何覆盖EF

中的插入行为

快乐的编码!