44

私は EF5 Code First を初めて使用し、職場でプロジェクトに着手する前に概念実証をいじっています。

私は最初に次のようなモデルを作成しました

public class Person {
  public int Id { get; set; }
  public string FirstName { get; set;}
  public string Surname {get;set;}
  public string Location {get;set;}
}

そして、上部に貼り付けた小さな MVC アプリケーションを使用して、いくつかのレコードを追加しました。

ここで、Location 列を次のような列挙型に変更したいと思います。

public class Person {
  public int Id { get; set; }
  public string FirstName { get; set;}
  public string Surname {get;set;}
  public Locations Location {get;set;}
}

public enum Locations {
  London = 1,
  Edinburgh = 2,
  Cardiff = 3
}

新しい移行を追加すると、次のようになります。

AlterColumn("dbo.People", "Location", c => c.Int(nullable: false));

しかし、update-database を実行するとエラーが発生します

Conversion failed when converting the nvarchar value 'London' to data type int.

移行で、alter ステートメントを実行する前にテーブルを切り捨てる方法はありますか?

データベースを開いて手動で実行できることはわかっていますが、もっとスマートな方法はありますか?

4

3 に答える 3

65

最も賢明な方法は、おそらく型を変更しないことです。これを行う必要がある場合は、次の手順を実行することをお勧めします。

  1. 新しいタイプで新しい列を追加します
  2. Sql()更新ステートメントを使用して元の列からデータを引き継ぐために使用します
  3. 古い列を削除します
  4. 新しい列の名前を変更します

これはすべて同じ移行で実行でき、正しい SQL スクリプトが作成されます。データを破棄する場合は、ステップ 2 をスキップできます。引き継ぐ場合は、適切なステートメントを追加します (switch ステートメントを含めることもできます)。

残念ながら、Code First Migrations には、これを実現する簡単な方法はありません。

コード例は次のとおりです。

AddColumn("dbo.People", "LocationTmp", c => c.Int(nullable: false));
Sql(@"
    UPDATE dbp.People
    SET LocationTmp =
        CASE Location
            WHEN 'London' THEN 1
            WHEN 'Edinburgh' THEN 2
            WHEN 'Cardiff' THEN 3
            ELSE 0
        END
    ");
DropColumn("dbo.People", "Location");
RenameColumn("dbo.People", "LocationTmp", "Location");
于 2013-02-12T16:39:14.580 に答える
23

@JustAnotherUserYouMayKnow の回答に基づいていますが、より簡単です。

最初にSql()コマンドを実行してから試してくださいAlterColumn()

Sql(@"
    UPDATE dbo.People
    SET Location =
        CASE Location
            WHEN 'London' THEN 1
            WHEN 'Edinburgh' THEN 2
            WHEN 'Cardiff' THEN 3
            ELSE 0
        END
    ");
AlterColumn("dbo.People", "Location", c => c.Int(nullable: false));
于 2015-04-18T18:02:12.330 に答える