2012-03-13 116 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()); 
    } 

    .... 
}