Entity framework 存储库中有 dapper

Entity framework with dapper in repository

我们正在使用 entity framework 和 repository/unit 的工作模式。现在,我们想将 dapper 与 EF 一起使用。以下是我们正在使用的一些基本 类:

 public interface IRepository<TEntity> where TEntity : class
 {
     void Add(TEntity entity);
     void Update(TEntity entity);
     void Delete(int id);
     TEntity GetById(int id);
     IEnumerable<TEntity> GetAll();
 }

 public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
 {
     protected readonly DbContext _context;
     protected readonly DbSet<TEntity> _entities;

     public Repository(DbContext context)
     {
         _context = context;
         _entities = context.Set<TEntity>();
     }

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

     public virtual void Update(TEntity entity)
     {
         _entities.Update(entity);
     }

     public virtual void Delete(int id)
     {
         var entity =  GetById(id);
         _entities.Remove(entity);
     }

     public virtual TEntity GetById(int id)
     {
         return _entities.Find(id);
     }

     public virtual IEnumerable<TEntity> GetAll()
     {
         return _entities.ToList();
     }
 }

public interface IUnitOfWork
 {
     IEmployeeRepository Employees { get; }
     ICityRepository Cities { get; }
     int SaveChanges();
 }

public class UnitOfWork : IUnitOfWork
 {
     readonly AppDbContext _context;

     IEmployeeRepository _employees;
     ICityRepository _cities;

     public UnitOfWork(AppDbContext context)
     {
         _context = context;
     }

     public IEmployeeRepository Employees
     {
         get
         {
             if (_employees == null)
                 _employees = new EmployeeRepository(_context);

             return _employees;
         }
     }

     public ICityRepository Cities
     {
         get
         {
             if (_cities == null)
                 _cities = new CityRepository(_context);

             return _cities;
         }
     }

     public int SaveChanges()
     {
         return _context.SaveChanges();
     }
 }


  public interface IEmployeeRepository : IRepository<Employee>
 {        
     bool CheckEmployeeExists(int employeeId, string employeeName);
 }


 public class EmployeeRepository : Repository<Employee>, IEmployeeRepository
     {
         public EmployeeRepository(DbContext context) : base(context)
         { }
      
    
         public bool CheckEmployeeExists(int employeeId, string employeeName)
         {
             // Implement Dapper code here
         }
    
         private AppDbContext _appContext => (AppDbContext)_context;
     }

现在,我们想实现一些 EmployeeRepository 的方法,比如 CheckEmployeeExists 来使用 Dapper。考虑到最佳编码实践,我们需要对上述代码进行哪些更改,以便 EF 和 dapper 都能以正确的方式工作。这里如何集成Dapper?

谢谢。

这是针对 EF Core 的(EF6 工作原理相同,但方法略有不同)。

或者open/close每个方法中的底层 DbConnection:

 public bool CheckEmployeeExists(int employeeId, string employeeName)
 {
    var con = context.GetDbConnection();
    con.Open();
    //use Dapper with DbConnection here
    con.Close();
 }

如果您Close()连接失败,它将被DbContext.Dispose()关闭,所以它对Close()并不重要,您一定不要 在此处调用 Dispose()

或者在构造函数中打开连接,然后它将在 DbContext 的生命周期内对任何方法可用,例如

 public EmployeeRepository(DbContext context) : base(context)
 { 
    this.con = context.GetDbConnection();
    con.Open();
 }