Оптимистичное исключение параллелизма при синхронном вызове обновления - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь изменить одно логическое свойство для моей сущности Invoice.
Это мой класс:

public class Invoice : SoftDeletableEntity, IIsActive
{
    public Invoice()
    {
        IsEditable = true;
    }

    [ForeignKey("Booking")]
    public int BookingId { get; set; }
    public Booking Booking { get; set; }
    [ForeignKey("Customer")]
    public int CustomerId { get; set; }
    public Customer Customer { get; set; }
    public string OurReference { get; set; }
    public string CustomerReference { get; set; }
    public DateTime InvoiceDate { get; set; }
    public string InvoiceNumber { get; set; }
    [ForeignKey("AccountInformation")]
    public int AccountInformationId { get; set; }
    public AccountInformation AccountInformation { get; set; }
    public string Summary { get; set; }
    public List<InvoiceInformation> ImportantInformation { get; set; }
    [ForeignKey("InvoiceItem")]
    public List<int> InvoiceItemIds { get; set; }
    public List<InvoiceLineItem> InvoiceLineItems { get; set; }

    [ForeignKey("InvoiceDocument")]
    public List<int> InvoiceDocumentIds { get; set; }
    public List<InvoiceDocument> InvoiceDocuments { get; set; }
    public string CreatedBy { get; set; }
    public string Terms { get; set; }
    public bool IsReversal { get; set; }
    public bool IsEditable { get; set; }
    public int? ParentInvoiceId { get; set; }
}

Эти классы экспортируются в формате PDF.Этот процесс работает довольно хорошо, и тогда у меня есть этот код, который проверяет, правильно ли был создан PDF, затем, если экспорт завершится успешно, код устанавливает счет-фактуру как неизменяемый, например:

    var doc = pdf.CreateInvoicePdf(resultModel, user);
    var bytes = GetPdfBytes(doc);

    if (bytes != null)
    {
        result.IsEditable = false;
    }

    unitOfWork.Commit();

Когда явызвать это "unitOfWork.Commit ();"Я получаю следующее исключение:

System.Data.Entity.Infrastructure.DbUpdateException: 'An error occurred while saving entities that do not expose foreign key properties for their relationships.  

Внутреннее исключение:

Message "Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=472540 for information on understanding and handling optimistic concurrency exceptions."

Последняя добавленная ссылка на внешний ключ была для CustomerId, но она настроена так же, как и все остальныевнешние ключи.Я проверил базу данных на FK = 0 для всех объектов внешнего ключа, и нет пропущенных ссылок.Кроме того, это работает на моем локальном компьютере, поэтому я уверен, что объект не был изменен другими источниками, кроме моего браузера.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 31 мая 2019

Вот несколько возможных причин, которые могут вызвать такую ​​проблему:

  1. Вы пытаетесь обновить сущность с помощью первичного ключа Id == 0 или другого значения default (Guid.Empty или string.Empty).Итак, убедитесь, что Id установлен правильно.
  2. Когда вы пытаетесь создать новый объект и скажите EF, что он был изменен с помощью EntityState.Modified.Затем он выдаст эту ошибку, поскольку она еще не существует в базе данных.Поэтому попробуйте использовать EntityState.Added.
  3. Вы пытались обновить или удалить строку, но строка не существует.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...