ASP.NET Core跨项目EF Core上下文实现CRUD的问题
解决方案
问题根源
IDefineContext接口未声明SaveChanges方法,导致注入后无法调用该方法- 泛型服务类的写法不符合C#语法规范,导致编译失败
方案一:扩展接口暴露EF Core核心方法
直接在项目B的IDefineContext接口中添加SaveChanges(及异步版本)的声明,因为项目A的APIDemoContext继承自DbContext,已经自带这些方法的实现,无需额外编写代码:
// 项目B中的接口修改 public interface IDefineContext { DbSet<TokenTable> TokenTables { get; set; } // 添加同步保存方法 int SaveChanges(); // 可选:添加异步保存方法(推荐用于Web场景) Task<int> SaveChangesAsync(CancellationToken cancellationToken = default); }
修改后,原TokenTableServices无需改动,_context.SaveChanges()即可正常调用。
方案二:使用泛型服务类(修正语法错误)
将TokenTableServices改为泛型类,通过类型约束同时继承DbContext和IDefineContext,这样既能访问IDefineContext的TokenTables,又能调用DbContext的SaveChanges:
1. 修正泛型服务类代码
// 项目B中的泛型服务类 public class TokenTableServices<T> where T : DbContext, IDefineContext { private readonly T _context; public TokenTableServices(T context) { _context = context; } public void AddTokens(TokenTable data) { _context.TokenTables.Add(data); _context.SaveChanges(); } // 可选:异步版本 public async Task AddTokensAsync(TokenTable data, CancellationToken cancellationToken = default) { await _context.TokenTables.AddAsync(data, cancellationToken); await _context.SaveChangesAsync(cancellationToken); } }
2. 在ASP.NET Core中注册服务
在Program.cs(或Startup.cs)中注册上下文和泛型服务:
// 注册项目A的数据库上下文 builder.Services.AddDbContext<APIDemoContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("YourConnectionString"))); // 注册泛型服务,指定具体的上下文类型 builder.Services.AddScoped<TokenTableServices<APIDemoContext>>();
3. 在API控制器中注入使用
[ApiController] [Route("api/[controller]")] public class TokenController : ControllerBase { private readonly TokenTableServices<APIDemoContext> _tokenServices; public TokenController(TokenTableServices<APIDemoContext> tokenServices) { _tokenServices = tokenServices; } [HttpPost] public IActionResult AddToken([FromBody] TokenTable token) { _tokenServices.AddTokens(token); return Ok(); } }
内容的提问来源于stack exchange,提问作者Jan Rar
相关产品推荐
相关产品推荐

