如何在MVC3(实体框架)中创建存储库类?

时间:2013-07-02 09:11:51

标签: asp.net-mvc asp.net-mvc-3 entity-framework repository-pattern

我使用 MVC3 - Entity Framework 创建了一个项目。我喜欢与它一起使用Repository Pattern。我是存储库模式的新手。我是否需要为每个模型类创建 ONE EACH存储库(表示数据库中每个表的类),并且在每个存储库中我是否必须编写所有将插入,更新,删除和获取记录

3 个答案:

答案 0 :(得分:0)

您可以创建具有通用方法的公共存储库,所有其他存储库将是它的子级:

public class MyModelRepository : GenericRepository<MyModel>
{
   // extend
}

var MyModelRepository = new MyModelRepository();

请参阅this,或google查看“Generic Repository”:)。如果您不需要某些模型存储库的扩展功能,那么您甚至可以不创建存储库类,而是执行以下操作:

var MyModelRepository = new GenericRepository<MyModel>();

答案 1 :(得分:0)

有一个表示每个存储库之间的公共操作的接口。即插入,更新,删除和获取:

 public interface IRepository<T>
    {
        void Insert(T entity);
        void Delete(T entity);
        void Update(T entity);
        void Fetch(T entity);
    }

 public class Repository<T> : IRepository<T> 
   /// your implementation
 }

然后在每个模型中,您可以定义适合上下文的存储库,例如:

  var repository1 = new Repository<ModelType>(dataContext);
  repository1.Insert(obj);

  var repository2 = new Repository<DifferentModelType>(dataContext);
  repository2.Fetch(objects);

http://www.remondo.net/repository-pattern-example-csharp/

答案 2 :(得分:0)

不,不。您可以为所有类实现GenericRepository,然后在需要添加函数时覆盖它。首先,我要告诉你工作单位。通过此类,您可以访问所有存储库。我在这个例子中添加了一个通用和一个覆盖:

public class UnitOfWork
{
    FBDbContext context = new FBDbContext();

    public FBDbContext Context { get { return context;  } }

    private BlockRepository BlockRepository;        
    private GenericRepository<Category> CategoryRepository;                     

    #region RepositoryClasses
    public IBlockRepository blockRepository
    {
        get
        {
            if (this.BlockRepository == null)
                this.BlockRepository = new BlockRepository(context);
            return BlockRepository;
        }
    }        
    public IGenericRepository<Category> categoryRepository
    {
        get
        {
            if (this.CategoryRepository == null)
                this.CategoryRepository = new GenericRepository<Category>(context);
            return CategoryRepository;
        }
    }        
#endregion

    public void Save()
    {
        context.SaveChanges();
    }

}

然后你有了通用存储库:

public class GenericRepository<TEntity>
{
    internal FBDbContext context;
    internal DbSet<TEntity> dbSet;

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

    public virtual TEntity Create()
    {
        return Activator.CreateInstance<TEntity>();
    }

    public IQueryable<TEntity> GetAll()
    {
        return dbSet;
    }
    //And all the functions you want in all your model classes...
}

以及要覆盖通用存储库的示例:

public class BlockRepository : GenericRepository<Block>
{
    public BlockRepository(FBDbContext context) : base(context) { }

    public IEnumerable<Block> GetByCategory(Category category)
    {
        return context.Blocks.Where(r => r.CategoryId == category.Id);
    }        
}