You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core跨项目EF Core上下文实现CRUD的问题

解决方案

问题根源

  1. IDefineContext接口未声明SaveChanges方法,导致注入后无法调用该方法
  2. 泛型服务类的写法不符合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 02:20:21