c# - Entity Framework Core 2.2.4 重复插入 DbUpdateException 删除了原始记录。这甚至可能吗?
问题描述
当发生重复插入异常时,我发现由于我们的代码中的一些错误而试图发生非法插入时,原始行被删除了。这是因为使用DeleteBehavior.ClientSetNull操作而发生的吗?我在这里想念什么?我们在代码中没有任何地方删除记录——没有触发器,甚至没有软删除。
下面的代码显示了引发的异常和 EF Core 生成的 DbContext 实体。
代码:
public async Task<int> AddCampaign(DigitalCampaign campaign)
{
try
{
await _dbContext.DigitalCampaign.AddAsync(campaign);
return await _dbContext.SaveChangesAsync();
}
catch (DbUpdateException ex)
{
throw new ApplicationException(
$"There was DbUpdateException error saving the Campaign {campaign.DcId} in OMS database. O1 SalesOrder: {campaign.OperativeSalesOrder.Single().SalesOrderId.ToString()}." +
$"{Environment.NewLine} Error: {ex.InnerException}");
}
catch (Exception e)
{
throw new ApplicationException(
$"There was an error saving the Campaign {campaign.DcId} in OMS database. O1 SalesOrder: {campaign.OperativeSalesOrder.Single().SalesOrderId.ToString()}." +
$"{Environment.NewLine} Error: {e.InnerException}");
}
}
受影响的实体:
entity.HasOne(d => d.DigitalCampaign)
.WithMany(p => p.CampaignOperativeProduct)
.HasForeignKey(d => d.DigitalCampaignId)
.OnDelete(**DeleteBehavior.ClientSetNull**)
.HasConstraintName("CampaignOperativeProduct DigitalCampaignId fk");
例外:
There was DbUpdateException error saving the Campaign a088A000002CWrIQAW in OMS database. O1 SalesOrder: 30002231.
Error: System.Data.SqlClient.SqlException (0x80131904): Cannot insert duplicate key row in object 'OMS.CampaignOperativeProduct' with unique index 'DigitalCampaignId and OperativeProductId together must be unique'. The duplicate key value is (2325, 11).
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows)
at System.Data.SqlClient.SqlDataReader.TryHasMoreResults(Boolean& moreResults)
at System.Data.SqlClient.SqlDataReader.TryNextResult(Boolean& more)
at System.Data.SqlClient.SqlDataReader.<>c__DisplayClass187_0.b__1(Task t)
at System.Data.SqlClient.SqlDataReader.InvokeRetryable[T](Func2 moreFunc, TaskCompletionSource1 source, IDisposable objectToDispose)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ConsumeAsync(RelationalDataReader reader, CancellationToken cancellationToken) ClientConnectionId:d3869a6f-d7ba-4ed4-bae7-1e5a2c3f2e6a
Error Number:2601,State:1,Class:14
解决方案
推荐阅读
- excel - VBA 代码。如何遍历一列,找到介于 0.9 和 1 之间的值,然后在这些值的左侧偏移 4 行?
- c++ - 不要删除不是所有者的原始指针
(i.11) - c# - 使用配置转换在 VSTS 上使用 MSI 部署的桌面应用程序构建/发布流程
- c - 指针:*p++ 作为左值和右值的区别
- java - 无需从 Firebase 进行更改即可获取孩子
- java - 通用方法。多个参数匹配
- r - 从 Sparklyr 中提取和可视化模型树
- c - strcpy() 在可变大小的字符串数组上生成分段错误
- android - 如何解析tf、root、activity的符号
- java - 延迟和间隔运算符无法正常工作