我有一個問題,我想在 SQL Server 引發例外后繼續插入資料。
我在表中的 3 個不同列上獲得了唯一索引以檢測重復項。
例如,我試圖插入 2 行,第一行是重復的,第二行不是。
當檢測到重復時,它進入catch,然后我什么也不做,但是當它出現在不是重復的第二行時,前一行再次引發例外。
這是我的代碼:
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);
}
謝謝您的幫助 !
uj5u.com熱心網友回復:
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 方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494609.html
