.NET Core 5 WebApp(IIS)+EF 重复插入记录问题求助
解决IIS部署的.NET Core 5应用EF重复插入记录问题
可能的原因及对应解决方案
1. DbContext生命周期配置错误
如果你的DbContext被注册为Singleton(单例),多个请求会共用同一个上下文实例,之前添加的实体可能在后续请求中被重复保存。
- 检查
Program.cs(或Startup.cs)中的DbContext注册代码,确保使用默认的Scoped生命周期:
(Scoped模式下每个请求会创建一个独立的DbContext实例,避免实体重复添加)services.AddDbContext<YourDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("YourConnString")));
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
相关产品推荐
相关产品推荐

