В базе данных уже есть объект с именем __MigrationHistory.

Когда я попытался выполнить SQLQuery (сгенерированный Update-Database -Verbose -f -Script локально в Visual Studio) в удаленной базе данных, я увидел следующую ошибку, возвращаемую SQL Server Management Studio:

Msg 2714, уровень 16, состояние 6, строка 1

В базе данных уже есть объект с именем __MigrationHistory.

Как это решить?


person Amirhossein Mehrvarzi    schedule 29.09.2014    source источник
comment
Какой сценарий вы пытаетесь запустить?   -  person BenjaminPaul    schedule 29.09.2014
comment
Это может произойти только в том случае, если сценарий содержит в себе команду «создать таблицу __MigrationHistory». Является ли? Хотя я не могу себе представить, зачем update-database это делает.   -  person Sachin Kainth    schedule 29.09.2014
comment
@BenjaminPaul Вы хотите увидеть его содержимое? Если да, то поставлю :)   -  person Amirhossein Mehrvarzi    schedule 29.09.2014
comment
@SachinKainth Значит, мне нужно найти такую ​​команду по запросу? потом удалить? Это должно решаться этим?   -  person Amirhossein Mehrvarzi    schedule 29.09.2014
comment
вы можете попробовать команду в nuget PM: add-migration, а также update-database   -  person jbutler483    schedule 29.09.2014
comment
Я увидел эту проблему при запуске Update-Database и обнаружил, что в исходный файл миграции был добавлен дополнительный CreateTable (dbo .__ MigrationHistory). Прокомментировал это, и обновление прошло нормально.   -  person Roberto    schedule 04.05.2018


Ответы (9)


__MigrationHistory - это автоматически сгенерированная таблица, используемая EF для отслеживания обновлений / исправлений, примененных к базе данных. EF полностью знает об этой таблице и обрабатывает ее самостоятельно. Вы не должны создавать / удалять / изменять эту таблицу. Кажется, в вашей базе данных уже есть эта таблица. Если EF или ваш сценарий обновления пытается создать такую ​​таблицу, это странно. Вам нужно все внимательно просмотреть и угадать / узнать, что на самом деле произошло, потому что либо EF взбесился, либо ваши скрипты подготовлены неправильно.

person quetzalcoatl    schedule 29.09.2014
comment
@MahmoudHboubati: спасибо за исправление опечатки! Я знаю, что сложно исправить однобуквенную ошибку, поскольку сайт требует, чтобы изменение было больше, но в таких случаях вы всегда можете добавить комментарий, например, эй, у вас есть опечатка в foobar, и автор исправит его. Вы действительно не должны повредить текст, случайно заменяя точки запятыми или удаляя пробелы. - person quetzalcoatl; 16.11.2015
comment
Хотя этот ответ является информативным, он бесполезен и не позволяет никому беспокоиться о проблеме. - person TravisO; 07.03.2017
comment
@TravisO: частично это правда, но это все, что мы можем получить без дополнительной информации. Помимо некоторых действительно экзотических вещей, таких как сильно поврежденная установка сервера базы данных, это единственный типичный возможный случай: этот сценарий неверен, поэтому он должен дважды или трижды проверить сценарий, чтобы понять, почему он пытался создать эту таблицу (в то время как сценарии из EF обычно не будет). Это очевидно, но у ОП есть этот сценарий, и он не сказал, что пытался его посмотреть, и не спросил, почему некоторые части этого сценария пытались создать эту таблицу, так что ... что еще я / мы могли бы ему посоветовать ? - person quetzalcoatl; 08.03.2017

Просто вопрос. Вы используете другую схему, кроме dbo?

Я думаю, что это ошибка в структуре EF, когда она не проверяет схему, когда проверяет, существует ли таблица __MigrationHistory.

Я смог решить эту проблему, просто создав таблицу Dummy __MigrationHistory со схемой dbo, это обманом заставило генератор EF6 «создать таблицу»

CREATE TABLE [dbo].[__MigrationHistory] ( [MigrationId] [nvarchar](150) NOT NULL, [ContextKey] [nvarchar](300) NOT NULL, [Model] [varbinary](max) NOT NULL, [ProductVersion] [nvarchar](32) NOT NULL, CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY ([MigrationId], [ContextKey]) )

Если вы хотите автоматизировать его, вам нужно будет создать пустую миграцию с фиктивным классом, который использует схему dbo, и сначала запустить эту миграцию, чтобы сгенерировать соответствующие таблицы. Затем запустите сценарии миграции с другой схемой, и все должно работать.

person Phillsta    schedule 31.03.2016
comment
Это спасло мне день. Я использую EF 6.1.3 более двух лет спустя и столкнулся с этой проблемой. Если я создам фиктивную таблицу __MigrationHistory, проблема исчезнет. Я не могу поверить, что пока нет версии 6.1.4, которая решает эту проблему! - person jgitter; 22.08.2018
comment
все еще встречается сегодня в 6.2.0 - person Leres Aldtai; 23.08.2019

Я видел это, когда выполнял «Сначала код из существующей базы данных», когда извлекаемая база данных уже имеет таблицу __MigrationHistory.

В итоге он добавляет класс типа POCO. Удалите класс, повторите миграции и снова запустите.

person pflous    schedule 14.10.2015

Вам следует либо изменить строку подключения вашего запускаемого проекта, чтобы она указывала на удаленную базу данных - может показаться, что она указывает на базу данных, в которой уже есть таблица __MigrationHistory, либо сгенерировать полный сценарий, используя

update-database -script -SourceMigration $InitialDatabase

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

person Miniver Cheevy    schedule 29.09.2014

Настройка для миграции может отсутствовать. Ввод команды add-migration MigrationName в консоли диспетчера пакетов перед обновлением базы данных сработал для меня, как предлагается в это руководство

person Emanuele Bellini    schedule 03.12.2015
comment
Верно :), но это произошло, когда у меня была создана настройка миграции с помощью той же команды! Похоже, что-то связанное с автоматической миграцией EF не работало должным образом и привело к генерации команды SQL для повторного создания таблицы __MigrationHistory вместо обновления! - person Amirhossein Mehrvarzi; 03.12.2015
comment
OK. Поэтому я надеюсь, что мой ответ может быть полезен другим, так как я не видел jbutler483 в комментариях к вашему вопросу. - person Emanuele Bellini; 03.12.2015

Измените имя базы данных в строке подключения в web.config, которую я решил после удаления базы данных. Это обходной путь, который помогает в среде разработки. База данных была воссоздана с новыми объектами.

person Rafael Souza    schedule 05.08.2017

Я открыл SQL Explorer из Visual Studio и подключился к базе данных. Удаленная таблица с использованием SQL напрямую. Удалена папка "Миграции". Снова пробежал миграции. Поскольку это тестовая база данных, не было большой проблемы с удалением таблицы. Если у него есть данные, вам нужно подумать о другом решении. Больше ничего не работало.

  1. Инструменты> SQL Server> Новый запрос
  2. перетащите таблицу "table_name";
  3. Обозреватель решений> Щелкните правой кнопкой мыши "Миграции и удалите".
  4. Инструменты> Диспетчер пакетов Nuget> Консоль диспетчера пакетов
  5. В консоли диспетчера пакетов (обычно открывается внизу экрана): Add-Migration InitialCreate4
  6. Обновление базы данных
person Srikrishna Krishnarao Srinivas    schedule 12.12.2019

Если вы используете существующую базу данных с EF и ядром .net, тогда на момент написания вам нужно будет создать начальную миграцию (dotnet ef database update) с пустыми методами Up / Down (вручную удалите код), поскольку -IgnoreChanges не реализован:

protected override void Up(MigrationBuilder migrationBuilder)
        {

        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
           
        }

Это предотвратит попытки миграции создать таблицы, как это обычно бывает при первой миграции в сценарии «сначала код».

Запустить

dotnet ef database update

После завершения вы сможете обновлять, используя обычные миграции.

См. https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/migrations/existing-database

А также

Что эквивалентно -IgnoreChanges для ядра entity-framework в интерфейсе командной строки?

person Tuna    schedule 01.08.2020

Перейдите в папку миграции. Вы увидите два файла: один - это конфигурация, а другой файл начинается с некоторого числа, например 019763632 ... откройте его, прокомментируйте код, который генерирует уже созданную таблицу. а затем включите автоматическую миграцию Enable-Migrations -EnableAutomaticMigrations update-database У меня это сработало, попробуйте

person Nagween Jaffer    schedule 16.10.2020