【问题标题】:Continue inserting data after duplicate exception - Sql Server / Entity Framework重复异常后继续插入数据 - Sql Server / Entity Framework
【发布时间】:2022-06-15 01:21:23
【问题描述】:

我有一个问题,我想在sql server引发异常后继续插入数据。

我在表中的 3 个不同列上获得了唯一索引以检测重复。

例如,我试图插入 2 个结果,第一个是重复的,第二个不是。

当检测到重复时,它会进入 Catch 然后我什么也不做,但是当它出现在不是重复的第二个 Result 上时,会再次为前一个 Result 引发异常。

我的代码在这里:

public async Task<IEnumerable<Result>> Handle(NewResultCommandDTO requests, CancellationToken cancellationToken) {
                var results = new List<Result>();

                ...

                for (var j = 0; j < resultDetails.Count(); j++)
                {
                    var rd = resultDetails.ElementAt(j);


                        var newResult1 = new Result
                            {
                                AthleteFEIID = rd.AthleteFEIID,
                                CompetitionCode = competition.CompetitionCode,
                                HorseId = horse.Id,
                            };

                        results.Add(newResult1);

                        try
                        {
                            await _resultsService.AddResultAsync(newResult1);
                            await _resultsService.CompleteAsync();
                        }
                        catch (Exception ex) {
                            var x = ex;
                        }

                    }
                }
}   

    public async Task AddResultAsync(Result result)
    {
        Context.Results.AddAsync(result);
    }

    public async Task CompleteAsync()
    {
        await Context.SaveChangesAsync().ConfigureAwait(false);
    }

感谢您的帮助!

【问题讨论】:

    标签: c# sql-server entity-framework


    【解决方案1】:

    await _resultsService.CompleteAsync(); 正在抛出 sql 异常语句。

    await _resultsService.AddResultAsync(newResult1); 语句已在 db 上下文中添加实体。即使下一条语句抛出异常并进入 catch 块,重复的实体仍会添加到上下文中。因此,当您在上下文中添加下一个实体并尝试保存它时,它会抛出异常,因为之前没有从上下文中删除的重复实体。

    一种解决方案是在进入 catch 块时从上下文中删除重复的实体。

    try
    {
        await _resultsService.AddResultAsync(newResult1);
        await _resultsService.CompleteAsync();
    }
    catch (Exception ex) {
        var x = ex;
        _resultsService.RemoveResult(newResult1);
    }
    
    
    public void RemoveResult(Result result)
    {
        Context.Results.Remove(result);
    }
    
    

    另一种解决方案是在添加之前检查表中是否已经存在重复项。为此,您必须使用唯一索引列编写 get 方法。

    【讨论】:

      猜你喜欢
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      相关资源
      最近更新 更多