Восстановите удаленную запись с тем же Id, что и раньше, когда поле ID (PK) является автоматическим приращением (MySQL с EF)

Я пытаюсь разработать систему изменений отката.
Я отслеживаю старые значения записи, когда идентификатор записи изменен или удален, а затем я использую эти значения, чтобы повторно вставить его, когда пользователь решит откатить его…

выпуски отката работают как и ожидалось.

удаления не являются… потому что при присоединении сущности к DBContext она имеет старый идентификатор, но при выполнении DbContext.SaveChanges (); идентификатор заменяется на новый (автоматическое увеличение)

Вот пример кода:

var model = JsonConvert.DeserializeObject(oldValues.OldData, type);
DbSet mySet = this.Set(type);
mySet.Attach(model);
this.Entry(model).State = oldValues.AuditType == 0 ? EntityState.Modified : EntityState.Added;
base.SaveChanges();

в модель.Id I can see the correct Id before save but after it EF changes it per a new one.

есть ли в любом случае, чтобы установить временно, чтобы сохранить текущий Id вместо создания нового?

Я пробовал много решений, но ни одно из них не работает.

Спасибо

1 ответ

  1. Чтобы отключить автоматически созданный идентификатор, необходимо выполнить эту команду в SQL:

    SET IDENTITY_INSERT [<schema>].[<TableName>] ON;  
    

    Затем вы можете вставить любое значение, которое вы хотите для PK, предполагая, что оно все еще доступно. Однако я не думаю, что у EF есть способ сделать это из кода.

    Я не совсем уверен, что это сработает, но, теоретически, вы можете запустить некоторый ad-hoc SQL прямо перед сохранением изменений в созданной вами транзакции, а затем посмотреть, примет ли ее EF.

    Если это не работает, то попробуйте это:

    ALTER TABLE theTableInQuestion AUTO_INCREMENT=1234
    

    EIDT: или попробуйте этот подход:

    Как заставить entity framework вставлять столбцы идентификаторов?