問題

私は、データベース内のいくつかのデフォルト値をクリーンアップするカスタムマイグレーションステップを作成しようとしています。基本的には、無効で更新する必要があるデータがいくつかあり、他の場合はまったく存在しません。システムはいくつかのサーバーにインストールされており、このデータの多くがある時点で手動で追加されたため、どのサーバーにどのデータがあるのか

私がしたいことは、すべてをきれいにするための移行ステップを作成することです。この値がテーブルに存在しない場合は、挿入する必要があります。しかし、それが存在する場合は、私はそれを更新するか、それを削除して挿入するだけです。私はこれを行う方法を考え出すのに苦労しています。

 Add-Migration DataCleanup
 

移行ステップを作成する

 public partial class DataCleanup : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.InsertData(
            table: "Blogs",
            columns: new[] { "BlogId", "Url" },
            values: new object[] { 4, "http://sample4.com" });}

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DeleteData(
            table: "Blogs",
            keyColumn: "BlogId",
            keyValue: 4);
    }
}
 

これは以前に行が存在しなかった場合に機能しますが、行が存在する場合は、値が正しい値であることを確認するために更新する必要があります。私はこれが参照テーブルであるため、主キーについて心配していません。

私が考えることができる唯一の他のオプションは、これらのテーブルで切り捨てを実行し、後に挿入を実行することです。

 migrationBuilder.Sql("TRUNCATE TABLE [Blogs]", true);
 

注意してください

私はまったくダウンをすることができないことに傾いています。私はこれを実行する前に、この1つのサーバーが何であるかを知る方法はありません。

  ベストアンサー

まず、私はテーブル上で切り捨てることができませんでした。外部キーが設定されています。

私は最初に行が存在するかどうかをチェックするSQL挿入の束を行い、そうでない場合は挿入します。

 migrationBuilder.Sql("INSERT INTO IdentityResources (Description, DisplayName, Emphasize, Enabled, Name, Required, ShowInDiscoveryDocument) " +
                                 "SELECT 'Your email address', 'User email', 1, 1, 'email', 0, 1 " +
                                 "WHERE NOT EXISTS(SELECT * " +
                                                  "FROM IdentityResources " +
                                                  "WHERE name = 'email'); ", true);
 

最初の挿入からキーを追加する必要があるとき、もう少し複雑になりました。

 migrationBuilder.Sql("INSERT INTO IdentityClaims (IdentityResourceId, Type) " +
                                         "SELECT id, 'email' " +
                                         "FROM IdentityResources " +
                                         "WHERE Name = 'email' " +
                                         "AND NOT EXISTS(SELECT * " +
                                         "FROM [IdentityClaims] " +
                                         "WHERE type = 'email')");
 

これは最後にうまくいきました。システムの新しいインストールは適切なデータベースを構築し、誰もが少なくとも必要なデータを持っていることを確認するために更新されます。

残念ながら、不要なデータを削除するには、別の日を待たなければなりません。

  同じタグがついた質問を見る

c#.net-coreentity-framework-core