2012-03-13 118 views
5

虽然我创建了使用linq to sql的存储库和服务,但我努力去理解它。我终于明白了,但现在我试图做同样的事情,但使用Code First EF。我很困惑这是如何与代码第一。如果我有一个存储库,我可以传入一个类对象,并有select(),等...这是如何相互作用或如何将它连接到/一个DbContext?如果有人能指引我正确的方向或给我一些建议,将不胜感激。在谷歌上没有太多的东西,因为它还是一个相对较新的模式。使用实体框架代码创建存储库优先4.3

如何使用/我会使用DbSet?这些库很酷但很混乱。

public class IRepository<T> : IDisposable 
     where T : class, new() 
{ 
    IQueryable<T> Select(); 

    IQueryable<T> SelectWith(params Expression<Func<T, object>>[] includeProperties); 

    T GetById(int id); 

    T GetByIdWith(int id, params Expression<Func<T, object>>[] includeProperties); 

    void InsertOnCommit(T model); 

    void DeleteOnCommit(T model); 

} 


public class DataContext : DbContext 
{ 
} 
+0

可以声明一个私有字段像仓库'私人的DataContext context'执行'IRepository '。 – 2012-03-13 06:22:14

回答

6

这里是信息库和的UnitOfWork在EF从ASP.Net一个Tutorial。希望这个帮助。 (的UnitOfWork是为了确保多个repositores共享相同的DataContext

通用库

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

     public GenericRepository(SchoolDBContext 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 = "") 
     { 
     ... 
     } 

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

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

     ... 
    } 

的UnitOfWork:调用Save()方法来更新您在库中的所有变化。

public class UnitOfWork : IDisposable 
{ 
    private SchoolDBContext context = new SchoolDBContext(); 
    private GenericRepository<Department> departmentRepository; 

    public GenericRepository<Department> DepartmentRepository 
    { 
     get 
     { 

      if (this.departmentRepository == null) 
      { 
       this.departmentRepository = new GenericRepository<Department>(context); 
      } 
      return departmentRepository; 
     } 
    } 

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

控制器

public class CourseController : Controller 
{ 
    private UnitOfWork unitOfWork = new UnitOfWork(); 

    // 
    // GET: /Course/ 

    public ViewResult Index() 
    { 
     var courses = unitOfWork.CourseRepository.Get(includeProperties: "Department"); 
     return View(courses.ToList()); 
    } 

    .... 
}