Хобрук: Ваш путь к мастерству в программировании

Восстановить удаленную запись с тем же идентификатором, что и ранее, когда поле идентификатора (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();

в model.Id я вижу правильный идентификатор перед сохранением, но после этого EF меняет его на новый.

Есть ли способ временно установить текущий идентификатор вместо создания нового?

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

Спасибо


Ответы:


1

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

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

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

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

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

ALTER TABLE theTableInQuestion AUTO_INCREMENT=1234

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

Как я могу заставить структуру сущности вставлять столбцы идентификаторов?

16.01.2017
  • Я уже пробовал это решение, но, похоже, оно не работает. Я получаю исключение Неизвестная системная переменная «IDENTITY_INSERT» при запуске этого: 16.01.2017
  • Database.ExecuteSqlCommand (Set Identity_Insert + tableName + ON); 16.01.2017
  • Также я попытался запустить его непосредственно в верстак и получил ту же ошибку. может быть, эта версия MySQL Server не поддерживает это? Я использую 5.6... 16.01.2017
  • Хм, другой вариант — запустить этот запрос прямо перед этим: ALTER TABLE theTableInQuestion AUTO_INCREMENT=1234 16.01.2017
  • Новые материалы

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

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

    Раскрытие возможностей НЛП: часть речевой маркировки и ее проблемы
    В сфере обработки естественного языка (NLP) маркировка частей речи (POS) выступает в качестве фундаментального метода, позволяющего компьютерам понимать и анализировать человеческий язык на..

    Под поверхностью: раскрытие деталей системы с помощью инструментов Linux CLI
    Чем больше вы изучаете Linux и продвигаетесь вперед, тем больше вам нужно проверять информацию о вашей системе. Эта информация может касаться аппаратного обеспечения, такого как процессор,..