Первая миграция кода - Entity Framework - невозможно добавить столбец в таблицу

Этот вопрос задавался много раз в разных вариантах SO. Я прошел через все ответы и сжег много времени. Я просто не могу заставить эту работу работать.

Я работаю над asp.net mvc Entity Framework, SQL-сервером. У меня уже есть существующая база данных, таблицы и т.д., И все работает. Мне просто нужно добавить новый столбец в таблицу.

Итак, я добавил свойство в класс модели, чтобы добавить столбец в таблицу. Но безуспешно.

Итак, я делаю шаги в следующем порядке.

  • Добавьте поле в класс модели.

    [Required]
    public string EmailSubject{ get; set; }
    
  • Затем я удаляю папку Migrations в моем проекте asp.net mvc, содержащем класс Configuration.cs
  • Затем в консоли диспетчера пакетов я успешно выдаю следующую команду.

    Enable-Migrations -ContextTypeName AppointmentReminder.Data.ReminderDb -Force
    
  • Затем я устанавливаю свойство true следующим образом

    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }
    
  • Затем я выдаю следующую команду в консоли диспетчера пакетов.

    Update-Database -Verbose -Force
    

Вот что моя строка подключения к соединению по умолчанию с базой данных выглядит как

Data Source=(LocalDb)\v11.0;AttachDbFilename=C:\practice\AppointmentReminder4\AppointmentReminder4\App_Data\aspnet-AppointmentReminder4-20141202060615.mdf;Initial Catalog=aspnet-AppointmentReminder4-20141202060615;Integrated Security=True

Но я НЕОБХОДИМО добавить новый столбец в нужную вам таблицу.


Изменить 1

Я обновил модель следующим образом без обязательного атрибута и выполнил все вышеперечисленные шаги, но я все еще НЕ смог добавить столбец в таблицу.

public string EmailBody { get; set; }

Вот все команды и их вывод.

PM> Enable-Migrations -ContextTypeName AppointmentReminder.Data.ReminderDb -Force
Checking if the context targets an existing database...
Code First Migrations enabled for project AppointmentReminder4.
PM> Update-Database -Verbose -Force
Using StartUp project 'AppointmentReminder4'.
Using NuGet project 'AppointmentReminder4'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'aspnet-AppointmentReminder4-20141202060615' (DataSource: (LocalDb)\v11.0, Provider: System.Data.SqlClient, Origin: Configuration).
No pending explicit migrations.
Running Seed method.
PM> Update-Database -Verbose -Force
Using StartUp project 'AppointmentReminder4'.
Using NuGet project 'AppointmentReminder4'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'aspnet-AppointmentReminder4-20141202060615' (DataSource: (LocalDb)\v11.0, Provider: System.Data.SqlClient, Origin: Configuration).
No pending explicit migrations.
Running Seed method.
PM> 

Изменить 2 Наконец, решила эту проблему. Все мои шаги выше были правильными. Кроме того, что я редактировал класс модели, а не фактический класс данных, который фактически привязан к объекту ReminderDb (объект EF). После того, как я обновил правильный класс с помощью свойства, каждая вещь работала успешно. Спасибо всем, кто ответил с помощью!

Ответ 1

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

public override void Up()
{    
    AddColumn("dbo.MyTable", "EmailSubject", c => c.String(nullable: false, defaultValue: ""));
}

Для справки: Значение по умолчанию для полей Обязательные для миграции Entity Framework?

Изменить:. На основе вашего редактирования вам нужно создать миграцию, прежде чем пытаться обновить ее. См. этот пример для того, как вы обычно используете его.

Тем не менее, если вы пытаетесь применить Code First Migrations к существующей базе данных, эта статья может помочь: Первые миграции кода с существующей базой данных

Ответ 2

Вы украсили новый столбец с обязательным атрибутом. Если в этой таблице уже есть несколько строк, эти строки не могут иметь этот столбец. Удалить необходимо. Чем миграция, заполните все строки данными. Сделайте требуемую собственность и снова перенастройтесь.