我們正在使用具有存盤庫/作業單元模式的物體框架。現在,我們想將 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?
謝謝你。
uj5u.com熱心網友回復:
這適用于 EF Core(EF6 的作業原理相同,但方法略有不同)。
在每個方法中打開/關閉底層 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();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/407990.html
標籤:
上一篇:無法創建物體框架代碼優先遷移
下一篇:如何將json檔案包含到天藍色
