实体框架-重复处理

0aydgbwb  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(298)

我使用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 .
我最初的想法是这是一个比赛条件的问题。
我能做些什么来防止这些错误,或者我应该如何处理它们?

4uqofj5v

4uqofj5v1#

你的问题不一定是代码,而是什么触发了代码。假设代码是由一个asp.net应用程序按钮触发的,如果用户双击该按钮,那么它可能会同时发出两个请求,从而导致创建两个实体。
因此,要么修复前端/入口点以消除双重创建场景,要么将所有内容推入一个同步服务/队列,以允许您进行重复数据消除或使用 Where 而不是 Single 处理代码中的重复。

相关问题