使用实体框架代码创建存储库第一4.3

本文关键字:存储 创建 实体 框架 代码 | 更新日期: 2023-09-27 18:27:29

前一段时间,我使用linq-to-sql创建了存储库和服务,我很难理解它。我终于理解了它,但现在我正在尝试做同样的事情,但使用Code First EF。我很困惑这是如何首先使用代码的。如果我有一个存储库,我可以直接传入一个类对象,并具有select()等。。。这是如何交互的,或者我如何将其连接到/a DbContext?如果有人能为我指明正确的方向或给我一些建议,我将不胜感激。谷歌上没有太多关于这方面的内容,因为这仍然是一个相对较新的模式。

如何使用/我会使用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
{
}

使用实体框架代码创建存储库第一4.3

这是ASP.Net的EF中的Repository和UnitOfWork教程。希望能有所帮助。(UnitOfWork是为了确保多个存储库共享相同的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()); 
    }
    ....
}