Entity Framework InvalidOperationException при откате - PullRequest
0 голосов
/ 29 августа 2018

Я интегрирую свое windows-приложение с nopcommerce. Так что при регистрации клиента в nopcommerce вся информация должна быть сохранена в новой таблице Customer моего приложения для Windows. для этого я создал триггер после вставки в таблицу GenericAttribute.

Но когда я собираюсь зарегистрировать клиента, возникает ошибка в следующей схеме на EfRepository.cs:

protected string GetFullErrorTextAndRollbackEntityChanges(DbUpdateException exception)
{
    //rollback entity changes
    if (_context is DbContext dbContext)
    {
        var entries = dbContext.ChangeTracker.Entries()
            .Where(e => e.State == EntityState.Added || e.State == EntityState.Modified).ToList();

        entries.ForEach(entry => entry.State = EntityState.Unchanged); //here error occurs
    }

    _context.SaveChanges();
    return exception.ToString();
}

и ошибка:

InvalidOperationException: свойство 'Id' для типа объекта GenericAttribute имеет временное значение при попытке изменить состояние сущности до 'Unchanged'. Либо установите постоянное значение явно, либо убедитесь, что база данных настроена для генерации значений для этого свойства

1 Ответ

0 голосов
/ 18 июля 2019

Я получил то же исключение, когда у меня был уникальный индекс, AddRange не удалось выполнить для уникального индекса, а затем внутри блока исключений catch была попытка удалить всю вставленную коллекцию. (Не мой код, но я должен был это исправить :-))

Пример кода (упрощенно):

try {
    context.AddRange(users); // List<User>, has property List<Contact>
    context.SaveChanges(); // throws exception on unique index
} catch (Exception ex) {
    context.RemoveRange(users); // this throws exception "The property 'UserID' on entity type 'Contact' has a temporary value"
    throw;
}

Я думаю, что вы пытаетесь сделать то же самое (внутренне) по-другому. Просто используйте транзакции вместо взлома EF.

...