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

Autofac依赖注入实现MVC项目WebAPI接口无报错但数据未入库问题

问题核心原因

  • 你当前的EfUnitOfWork中实例化Dal层对象时没有传入持有的ATKlogMSSqlContext,导致添加数据操作和保存操作使用的是完全独立的两个DbContext实例,自然无法将数据持久化到数据库
  • 服务生命周期配置不匹配:EfUnitOfWork注册为单例,但ATKlogMSSqlContext是请求级作用域,单例UoW只会初始化一次DbContext,后续请求的上下文要么已被释放要么状态异常,也会导致数据无法正常保存

修复步骤

1. 修正EfUnitOfWork的Dal实例化逻辑

你直接new出来的EfArticleDal等Dal对象,内部使用的是自己初始化的DbContext,和UoW中持有的_context不是同一个实例,需要把_context传入Dal的构造函数:

// 假设你的EfXXXDal构造函数都支持传入ATKlogMSSqlContext参数,修改属性初始化逻辑
public IArticleDal Articles => _efArticleDal ??= new EfArticleDal(_context);
public ICategoryDal Categories => _efCategoryDal ??= new EfCategoryDal(_context);
public ICommentDal Comments => _efCommentDal ??= new EfCommentDal(_context);
public IRoleDal Roles => _efRoleDal ??= new EfRoleDal(_context);
public IUserDal Users => _efUserDal ??= new EfUserDal(_context);

同时确认所有EfXXXDal的构造函数正确接收并使用传入的DbContext进行数据操作,不要在Dal内部自行new新的DbContext。

2. 修正Autofac的生命周期配置

修改AutofacBusinessModule中UoW和批量服务的注册规则,和DbContext的请求级作用域保持一致:

// 把UoW从SingleInstance改成InstancePerLifetimeScope,每个请求对应一个UoW实例
builder.RegisterType<EfUnitOfWork>().As<IUnitOfWork>().AsSelf().InstancePerLifetimeScope();

// 批量注册的服务也同步调整生命周期,避免单例服务依赖请求级服务引发的生命周期不匹配问题
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces()
    .EnableInterfaceInterceptors(new ProxyGenerationOptions()
    {
        Selector = new AspectInterceptorSelector()
    }).InstancePerLifetimeScope();

修改完成后重新运行即可正常将数据存入数据库。

内容的提问来源于stack exchange,提问作者ATK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:09:03