首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >存储库中带有dapper的实体框架

存储库中带有dapper的实体框架
EN

Stack Overflow用户
提问于 2022-01-07 12:33:05
回答 1查看 362关注 0票数 0

我们使用的是带有存储库/工作单元模式的实体框架。现在,我们想和EF一起使用dapper。下面是我们正在使用的几个基本类:

代码语言:javascript
运行
复制
 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集成到这里?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-07 15:09:57

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

打开/关闭每个方法中的基础DbConnection:

代码语言:javascript
运行
复制
 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的生存期内对任何方法可用,例如

代码语言:javascript
运行
复制
 public EmployeeRepository(DbContext context) : base(context)
 { 
    this.con = context.GetDbConnection();
    con.Open();
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70621336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档