首页 > 解决方案 > 实体框架 - 重复处理

问题描述

我使用 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.

我最初的想法是这是一个竞争条件问题。

我可以做些什么来防止这些错误,或者我应该如何处理它们?

标签: c#mysqlentity-framework

解决方案


您的问题不一定是代码,而是触发该代码的原因。假设代码是由 ASP.net 应用程序按钮触发的,如果用户双击该按钮,那么它可能会同时发出两个请求,从而导致创建双重实体。

因此,要么修复您的前端/入口点以消除双重创建场景,将所有内容推送到同步服务/队列中,这将允许您进行重复数据删除或使用Where而不是Single处理代码中的重复。


推荐阅读