web-dev-qa-db-ja.com

Code First Migration-Entity Framework-列をテーブルに追加できません

この質問は、SOのさまざまなフレーバーで何度も質問されています。私はすべての答えを調べ、多くの時間を費やしました。私はこれを機能させることができないようです。

私はasp.net mvc Entity Framework、SQLサーバーアプリに取り組んでいます。すでに既存のデータベース、テーブルなどがあり、すべてが機能しています。テーブルに新しい列を追加するだけです。

だから..モデルクラスにプロパティを追加して、テーブルに列を追加できるようにしました。しかし、成功していません。

したがって、次の順序で手順を実行します。

  1. モデルクラスにフィールドを追加します。

    [Required]
    public string EmailSubject{ get; set; }
    
  2. その後、Configuration.csクラスを含むasp.net mvcプロジェクトのMigrationsフォルダーを削除します
  3. 次に、パッケージマネージャーコンソールで、次のコマンドを正常に発行します。

    Enable-Migrations -ContextTypeName AppointmentReminder.Data.ReminderDb -Force
    
  4. 次に、次のようにプロパティをtrueに設定します

    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }
    
  5. 次に、パッケージマネージャーコンソールで次のコマンドを発行します。

    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オブジェクト)に実際に関連付けられている実際のデータクラスではなく、モデルクラスを編集していた場合を除きます。プロパティで正しいクラスを更新した後、すべてが正常に機能しました。助けてくれたすべての人に感謝します!

15

フィールドは必須なので、デフォルト値を指定する必要があります。移行ファイルを編集し、列を追加する行を見つけて、デフォルト値を指定します。

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

参考: Entity Framework移行の必須フィールドのデフォルト値?

編集:編集に基づいて、更新を試みる前に移行を作成する必要があります。通常の使用方法については、 この例 を参照してください。

ただし、既存のデータベースにCode First Migrationsを適用する場合は、この記事が役立つ場合があります。 既存のデータベースを使用したCode First Migrations

15
Will Eddins

新しい列を必須属性で装飾しました。そのテーブルにすでにいくつかの行がある場合、それらの行はその列を持つことができません。削除する必要があります。移行よりも、すべての行にデータを入力します。プロパティを必須にして、再度移行します。

6
tmg