c# - 实体框架 - 重复处理
问题描述
我使用 Entity Framework 6、C# 和 MySQL InnoDB 作为我们的数据库引擎。
我有以下代码来“插入重复更新”记录:
public async Task AddHostIdToGroup(HostsToGroup hostToGroup)
{
using (var context = new MaintDbContext())
{
HostsToGroup htg = context.HostsToGroup.SingleOrDefault(hs => hs.HostId == hostToGroup.HostId);
if (htg != null)
{
htg.GroupId = hostToGroup.GroupId;
await context.SaveChangesAsync();
}
else
{
context.HostsToGroup.Add(hostToGroup);
await context.SaveChangesAsync();
}
}
}
代码本身看起来不错insert on duplicate update
。
不过,在我们的生产服务器上,我偶尔会看到duplicate errors
.
我最初的想法是这是一个竞争条件问题。
我可以做些什么来防止这些错误,或者我应该如何处理它们?
解决方案
您的问题不一定是代码,而是触发该代码的原因。假设代码是由 ASP.net 应用程序按钮触发的,如果用户双击该按钮,那么它可能会同时发出两个请求,从而导致创建双重实体。
因此,要么修复您的前端/入口点以消除双重创建场景,将所有内容推送到同步服务/队列中,这将允许您进行重复数据删除或使用Where
而不是Single
处理代码中的重复。
推荐阅读
- node.js - Electronjs 和 Nodejs(Crypto) crypto.scryptSync 不是函数
- python - HTML中的变量被擦除了吗?
- java - Java:正则表达式查找子字符串集合
- php - 如何获取 wp_editor() 的 textarea 的值
- spark-streaming - 有没有办法在火花流窗口中提取窗口开始时间和窗口结束时间?
- powershell - 替换 PSCustomObject 属性中的“,”,同时保留对象类型
- angular - 如何同时引用两个活动的 ngFor ?
- javascript - 为什么从对象中获取项目返回未定义?
- c# - 等效于 LambdaExpression 的 Delegate.Target
- c# - .net 核心应用程序中 ServicePointManager.DefaultConnectionLimit 的最高安全数是多少?