11

次の単純なモデルがあるとします。

public class Car
{
    public int Year { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
    public CarType Type { get; set; }
}

public enum CarType
{
    Car, Truck
}

CarEntity Framework は、データベースに新しいオブジェクトを追加するときに、CarType列挙値を整数として格納します。

CarType整数値が変化する方法で列挙型を変更した場合(順序の変更または値の追加/削除)、 Entity Framework は移行を使用してデータ移行を適切に処理する方法を認識していますか?


たとえば、別の値を に追加したとしますCarType

public enum CarType
{
    Car, Truck, Van
}

これは、データベース内の既存のデータには実際には影響しません。0まだまだですCar1まだまだTruckです。しかし、次のように の順序を変更すると、次のCarTypeようになります。

public enum CarType
{
    Car, Van, Truck
}

更新されたモデルによるとが現在であるため、指定する が1のデータベース レコードは正しくありません。CarTypeTruck1Van

4

1 に答える 1

8

いいえ、移行、順序の変更、追加、削除などの変更を反映するためにデータベースの値を更新しないため、列挙型の変更を完全にはサポートしていません。

順序を維持しながら列挙値を追加しても効果はありません。実際、モデル バッキング変更エラーは発生しません。

列挙型の順序がCarType変わると、データベース データは事実上無効になります。元のint値は保持されますが、enum の結果は間違ったものになります。

この種の変更に対応するには、データベース データを手動で処理する必要があります。この特定の例ではType、列挙型の変更に従って列の値を変更するカスタム SQL を実行する必要があります。

public partial class CarTypeChange : DbMigration
{
    public override void Up()
    {
        // 1 now refers to "VAN", and 2 now refers to "Truck"
        Sql("Update cars Set [Type] = 2 Where [Type] = 1");
    }

    public override void Down()
    {
        Sql("Update cars Set [Type] = 1 Where [Type] = 2");
    }
}

補遺: これに関連する別の質問をしました: Entity Framework 5 で列挙型の変更を処理する

于 2012-08-13T20:34:07.077 に答える