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

.NET Core 5 WebApp(IIS)+EF 重复插入记录问题求助

解决IIS部署的.NET Core 5应用EF重复插入记录问题

可能的原因及对应解决方案

1. DbContext生命周期配置错误

如果你的DbContext被注册为Singleton(单例),多个请求会共用同一个上下文实例,之前添加的实体可能在后续请求中被重复保存。

  • 检查Program.cs(或Startup.cs)中的DbContext注册代码,确保使用默认的Scoped生命周期:
    services.AddDbContext<YourDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("YourConnString")));
    
    (Scoped模式下每个请求会创建一个独立的DbContext实例,避免实体重复添加)

2. 前端重复提交

用户多次点击提交按钮、网络延迟导致页面未及时跳转,都可能触发多次请求。

  • 前端提交后立即禁用提交按钮,示例:
    document.getElementById('submitBtn').addEventListener('click', function(e) {
        e.target.disabled = true;
        document.getElementById('yourForm').submit();
    });
    
  • 后端可添加防重复提交验证:在表单中生成唯一令牌(如Guid),存储到Session或缓存,提交时验证令牌是否已使用。

3. IIS应用池或请求处理异常

应用池线程卡住、请求队列积压可能导致请求被重复处理。

  • 检查IIS应用池设置:启用快速失败保护,避免进程异常后重复处理请求;调整请求队列长度至合理值。
  • 确保应用中所有异步操作都正确使用await,避免用.Result或.Wait()阻塞线程,防止上下文资源泄漏。

4. EF上下文未正确释放

如果在其他业务逻辑中存在未正确释放DbContext的情况,可能导致实体被意外重复添加。

  • 确保所有使用DbContext的地方都遵循依赖注入的生命周期,不要手动创建DbContext实例(除非使用using块包裹)。

代码优化建议

你的Create方法本身逻辑没问题,但可以添加日志排查问题:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ProductId,Name,Category,Color,UnitPrice,AvailableQuantity")] Products products)
{
    if (ModelState.IsValid)
    {
        // 添加日志,记录当前请求ID和实体信息
        _logger.LogInformation($"处理添加产品请求,请求ID:{HttpContext.TraceIdentifier},产品名称:{products.Name}");
        _context.Add(products);
        await _context.SaveChangesAsync();
        _logger.LogInformation($"产品添加完成,请求ID:{HttpContext.TraceIdentifier}");

        return RedirectToAction(nameof(Index));
    }

    return View(products);
}

通过日志可以确认是同一请求被重复处理,还是多个独立请求导致的重复插入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:01:11