Ошибка миграции: column already exists

Пытаюсь добавить миграцию:

dotnet ef migrations add add_ProductGroup --context migrationsdbcontext
dotnet ef database update --context migrationsdbcontext

И после Update выдает ошибку: "column "ProductGroupId" of relation "Products" already exists".

Модель ProductGroup (для нее делаю миграцию):

public class ProductGroup : IHaveIntegerId
    {
        public int Id { get; set; }
        [Localize] public string Title { get; set; }
        public UserGroup? UserGroup { get; set; }
        public ICollection<Product> Products { get; set; }
        public int? RegionId { get; set; }
        public Region Region { get; set; }
    }

В таблице Products есть колонка ProductGroupId.

Я до этого создал миграцию и удалил в VS через TeamExplorer. Может, из таблицы Products не удалилась колонка ProductGroupId. Непонятно, как ее теперь удалить

введите сюда описание изображения


Ответы (1 шт):

Автор решения: A K

К сожалению вы некорректно сделали, удалив файлы после того, как применили транзакцию.

Правильно было сначала откатить миграцию через Remove-Migration -- она выполняет все проверки структуры, аккуратно убирает добавленные поля, сама удаляет файлы миграции.

Запомните эту команду на будущее, пригодится.

Как теперь всё-таки выкрутиться из ситуации и вернуться к корректному, согласованному состоянию:

  1. Вручную удалите поле через SSMS
  2. В таблице базы данных __EFMigrationsHistory удалите строку с вашей удалённой миграцией 20200217112046

Это самый крайний случай (он основан на понимании как устроен и работает EF Core), так же у вас есть альтернативы.

Во-первых, если вы успели файлы положить в версионный контроль, то можете просто достать их обратно и удалить корректно через Remove-Migration

Во-вторых, если это не продакшн база, а учебно-тренировочная и вам не жалко данных, которые в ней содержатся -- можно просто удалить базу и создать заново дав команду Update-Database.

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

PS И отдельно, обратите внимание, что у вас в файле *.csproj после выполнения Remove-Migration остались строки удаления миграции, они не мешают, но я люблю чистоту, поэтому удаляю их и не коммичу.

→ Ссылка