Entity Framework Core 2.2.4 Двойная вставка DbUpdateException удаляет исходную запись. Это вообще возможно? - PullRequest
0 голосов
/ 11 октября 2019

Когда возникает исключение повторной вставки, я обнаружил, что исходная строка была удалена, когда произошла неправильная вставка из-за некоторой ошибки в нашем коде. Это происходит из-за использования действия 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...