如何在自定义IMyDBContext接口中调用Database.ExecuteSqlRawAsync方法
你无法通过当前IMyDBContext调用Database.ExecuteSqlRawAsync的核心原因是:你定义的接口仅暴露了DbSet<Branch>属性,没有包含任何和EF Core数据库操作相关的Database成员,所以无法直接访问。
下面是两种常用的实现方案:
方案1:直接在接口暴露Database属性
适合不需要刻意隔离EF Core依赖的场景,无需额外写实现代码,同时可以使用Database下的所有方法(比如事务操作、SQL执行等)。
- 修改
IMyDBContext接口,新增DatabaseFacade类型的属性:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; public interface IMyDBContext { public DbSet<Branch> Branch { get; set; } // 新增Database属性,DbContext基类本身已自带该属性,无需额外实现 public DatabaseFacade Database { get; } }
- 调用方式和原生DbContext完全一致:
await _context.Database.ExecuteSqlRawAsync("exec foofoo");
方案2:封装SQL执行方法(更符合依赖倒置原则)
适合希望上层业务不直接依赖EF Core的场景,接口层无需引用EF Core相关包,仅封装需要的方法即可。
- 在
IMyDBContext中定义执行原生SQL的方法:
public interface IMyDBContext { public DbSet<Branch> Branch { get; set; } // 封装SQL执行方法,参数可根据自己的需求扩展 Task<int> ExecuteSqlRawAsync(string sql, params object[] parameters); }
- 在实现
IMyDBContext的DbContext类中实现该方法:
public class MyDBContext : DbContext, IMyDBContext { public DbSet<Branch> Branch { get; set; } public Task<int> ExecuteSqlRawAsync(string sql, params object[] parameters) { // 直接调用基类Database的对应方法即可 return Database.ExecuteSqlRawAsync(sql, parameters); } }
- 调用方式:
await _context.ExecuteSqlRawAsync("exec foofoo");
内容的提问来源于stack exchange,提问作者Alex D
相关产品推荐
相关产品推荐

