0

Entity Framework の移行に取り組んでいます。

モデルを変更して add-migration を使用すると正常に動作しますが、モデルを 2 回目に変更して add-migration コマンドを実行すると、生成されたファイルには最初と 2 番目に行った SQL の変更が含まれています。

なぜ私がこのような行動をとっているのか、誰か教えてください。

ここにモデルがあります

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Department>().Property(p => p.NewCol2).HasColumnName("ColChanged");
    }

public class Department
{
    public int DeptId { get; set; }
    public int DivNo { get; set; }
    public string DeptName { get; set; }
public string NewCol2 { get; set; }

    public List<Employee> Employees { get; set; }
}

public class Employee
{

    public int EmpNo { get; set; }
    public int DivisionNo { get; set; }
    public int DeptId { get; set; }
    public string EmpName { get; set; }

    public Department Department { get; set; }
}
 }

NewCol2 の名前を ColChange に変更したかったので、ModelBuilder にプロパティを記述し、以下に示すように生成されたファイルを取得しました。

最初の cs ファイル

Up() のみ

 AddColumn("dbo.Departments", "ColChanged", c => c.String());

[Required] アノテーションを追加して EMPName を必須に変更しようとすると、以下のように生成されたファイルが得られました

2 番目の cs ファイル

     AddColumn("dbo.Departments", "ColChanged", c => c.String());
    AlterColumn("dbo.Employees", "EmpName", c => c.String(nullable: false));

ありがとうございました

4

1 に答える 1

0

これが起こるのを私が見た 1 つの場所は、共同作業環境で作業していて、2 人の人が独立したブランチで追加移行を行っている場所です。これらの移行は両方とも、モデルの状態を __MigrationHistory テーブル エントリ (移行の resx ファイルに格納されているもの) にシリアル化します。

次に、変更が単一のブランチにマージされると、移行は外部からはうまく見えます-プロジェクト内でそのうちの1つが別の後に続きます-しかし、最新の移行(それを「B」と呼びましょう)には変更が含まれていません前の移行 (「A」) に含まれるモデル。

update-database を呼び出すと、すべての移行が実行され、期待どおりにデータベースが最新の状態になります。ただし、問題は、3 番目の移行「C」が追加されたときに発生します。この移行では、「B」からのシリアル化されたモデルの状態を使用して、モデルへのデルタを理解します。ただし、'B' からのシリアル化されたモデルには 'A' が表す変更が含まれていないため、移行 'C' は SQL ステートメントを生成して、'A' と 'C' の両方の変更をカバーしようとします。

これに対する解決策は、移行「A」に戻り、「B」と「C」を削除して、データベースが「A」のみが適用された状態であることを確認することです。次に add-migration を作成して、'B' と 'C' をカバーするものを作成します。

将来これを防ぐには、コードをブランチに統合する人の責任で、他の誰かの移行にマージされたことを発見した場合、移行を削除して再作成する必要があります。

于 2013-12-01T13:40:45.117 に答える