0

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

CreateTable(
      "dbo.YogaSpaceEvents", 
      c => new 
       { 
        YogaSpaceEventId = c.Int(nullable: false, identity: true), 
        Title = c.String(), 
        DateTimeScheduled = c.DateTime(nullable: false), 
        AppointmentLength = c.Int(nullable: false), 
        StatusEnum = c.Int(nullable: false), 
        YogaSpaceRefId = c.Int(nullable: false), 
       }) 
      .PrimaryKey(t => t.YogaSpaceEventId, clustered: false) 
      .ForeignKey("dbo.YogaSpaces", t => t.YogaSpaceRefId, cascadeDelete: true) 
      .Index(t => t.DateTimeScheduled, clustered: true) 
      .Index(t => t.YogaSpaceRefId); 

При запуске обновления-базы данных я получаю сообщение об ошибке говорящее «субъект„blahblah“уже существует в базе данных». Это происходит из первого заявления «CrateTable» в файле миграции. Каковы шаги по обновлению базы данных с моими изменениями в файле миграции? Нужно ли создавать другой файл миграции только с изменениями?

ответ

0

Вы завысили механизм миграции. Цель состоит в том, чтобы управлять переходами баз данных между последовательными миграциями, это недостаточно умно, чтобы распознавать ваши изменения в коде миграции. Обычно для изменения структуры базы данных необходимо создать новую миграцию с помощью таблиц, столбцов, индексов и т. Д. Для соответствия новой структуре. С IndexAttribute (версия 6.1) вы можете определить индекс в DateTimeScheduled для кластеризации, и EF автоматически распознает, что эта модель изменилась, и когда вы будете использовать add-migration, она будет генерировать миграцию, изменяющую YogaSpaceEvents для вас.

Если вы настаиваете, что вы не хотите иметь отдельную миграцию, но изменения должны быть включены в текущем у вас есть 2 вариант:

  1. перенастройки базы данных к предыдущей миграции, использовать «надстройку миграции -Force ", чтобы восстановить текущую миграцию в соответствии с вашими изменениями, а затем применить миграцию в вашу базу данных.
  2. С помощью функции« добавить-перенос »добавьте новую миграцию, применив ваши изменения к db. Затем перенесите свою базу данных в новейшее состояние. После этого удалите недавно добавленный файл миграции, используя «add-migration -Force», примененный в какой-либо тестовой базе данных, восстановите первоначальную миграцию, чтобы включить с ней ваши изменения в модель. Последнее, что нужно сделать, - удалить в базе данных строку __MigrationsHistory, соответствующую удаленной миграции, и обновить значение поля «Модель» строки thr, соответствующее начальной миграции, в значение поля «Модель» из строки, соответствующей удаленной миграции.

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

+0

привет. Возможно, я могу перефразировать мой вопрос: как изменить таблицу в файле миграции? Я могу сказать «add-migration ChangeIndex» и создать новый файл. В этом файле я хотел бы изменить некоторые индексы таблиц (например, удалить кластер из первичного ключа в другой индекс), а затем обновить базу данных. – user1186050

+1

Насколько я знаю, кластеризованный индекс на столе может быть установлен только тогда, когда он создается. Механизм миграции EF недостаточно велик, чтобы распознать это.Поэтому в вашем случае вам придется удалить таблицу YogaSpaceEvents (инструкцию DropTable) и создать ее еще раз с помощью инструкции CreateTable. Разумеется, вам нужно отказаться от любых внешних ключей, ссылающихся на вашу таблицу, а также перед тем, как отбросить. Если вы хотите сохранить свои данные из YogaSpaceEvents, вместо того, чтобы сбросить изменения, введите имя с помощью RenameTable, затем создайте новую таблицу, скопируйте данные с помощью функции Sql и отбросьте старую таблицу. – mr100

0

Вы не можете редактировать существующую миграцию и применять ее без обновления до этой миграции, а затем повторно обновлять ее до последней. Таким образом, вы запускаете все сценарии Down(), которые удаляют таблицу.

В качестве альтернативы вы создаете новую миграцию и явно выполняете операции (операции), необходимые в Up(), и отменяете их в Down().

 Смежные вопросы

  • Нет связанных вопросов^_^