Установите идентификатор в предыдущем созданном столбце во время миграции.

code-first-migrations ef-code-first entity-framework entity-framework-6

Вопрос

У меня есть проект с базой данных CodeFirst (Entity Framework 6) и двумя этапами миграции. База данных обновляется автоматически, используя этот код в Application_Start в Global.asax:

Database.SetInitializer(
          new MigrateDatabaseToLatestVersion<MyDBEntities, MyNamespace.Configuration>());

Первый шаг миграции создает таблицы:

CreateTable(
     "dbo.GalleryAlbum",
      c => new
      {
           Id = c.Int(nullable: false),
           //other columns.....
       })
       .PrimaryKey(t => t.Id);

CreateTable(
       "dbo.GalleryPics",
       c => new
       {
           Id = c.Int(nullable: false),
           //other columns.....
       })
       .PrimaryKey(t => t.Id)
       .ForeignKey("dbo.GalleryAlbum", t => t.AlbumId)
       .Index(t => t.AlbumId);

Второй шаг миграции - добавление тождеств к созданным таблицам:

AlterColumn("dbo.GalleryAlbum", "Id", c => c.Int(nullable: false, identity: true));
AlterColumn("dbo.GalleryPics", "Id", c => c.Int(nullable: false, identity: true));

Когда я запускаю приложение, я вижу, что второй код миграции запущен, информация о двух миграциях добавляется в таблицу _MigrationHistory, но столбцы в обеих таблицах не изменяются (без Identity). Вот схема:

[Id]        INT             NOT NULL,
//other columns

Код Первые классы для первой миграции следующие:

 public partial class GalleryAlbum
 {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }
 }
 //GalleryPics is the same

и этот для второго этапа миграции:

public partial class GalleryAlbum
 {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
 }
 //GalleryPics is the same

Не могли бы вы рассказать мне, почему Identity не добавляется в эти столбцы и как я могу это исправить?

Благодарю.

Обновление: сгенерированные запросы на обновление базы данных, которые я получил от IDbCommandInterceptor:

ALTER TABLE [dbo].[GalleryAlbum] ALTER COLUMN [Id] [int] NOT NULL
ALTER TABLE [dbo].[GalleryPics] ALTER COLUMN [Id] [int] NOT NULL

Принятый ответ

Вы не можете ALTER для столбца Identity в SQL Server, см. Добавление идентификатора в существующий столбец

Вместо этого попробуйте добавить идентификатор и столбец за один шаг:

CreateTable(
         "dbo.GalleryAlbum",
          c => new
          {
              Id = c.Int(nullable: false, identity:true),
              //other columns.....
          }).PrimaryKey(t => t.Id);

Популярные ответы

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

  1. Резервное копирование базы данных ...
  2. Измените свой класс, чтобы в вашем коде была идентичность
  3. Создайте миграцию с помощью консоли диспетчера пакетов ( add-migration [your migration name] ).
  4. Прокомментируйте код в методе Up во вновь созданной миграции
  5. Добавьте новую строку кода, готовую для получения SQL, которую вы создадите ниже: Sql (@" ");
  6. Войдите в SSMS и убедитесь, что он настроен на создание сценариев при изменении таблицы
  7. Добавить идентификатор в дизайнере таблицы в SMSS
  8. Сохраните изменение таблицы в SSMS и скопируйте созданный SQL. (Что SQL делает копию таблицы с данными, удаляет исходную таблицу, затем воссоздает исходную таблицу с идентификатором, установленным в столбце, а затем копирует все данные и снова добавляет все внешние ключи и ограничения)
  9. Вставьте SQL, который вы только что скопировали между речевыми метками в коде, который вы добавили выше.
  10. Запустить миграцию

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

NB: метод Down который был сгенерирован, не будет работать либо потому, что он удалит идентификатор, который EF также не может сделать . Если вам нужен метод Down для работы, создайте копию добавленного SQL и настройте его, чтобы снова создать таблицу без идентификатора.




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему