Pomelo.entityframeworkcore.mysql: エンティティの名前変更

作成日 2020年02月20日  ·  3コメント  ·  ソース: PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

エンティティの名前を変更すると、テーブルの名前を変更するだけでなく、テーブルが削除されて作成されます。

closed-question type-question

最も参考になるコメント

これはEFの固有の制限であり、Pomeloに直接ではありません。 EFは通常、テーブルのドロップ/作成と名前変更を区別できません。

名前の変更であることを伝える秘訣は、エンティティクラスの属性を介して、またはOnModelCreating fluent APIを介して、テーブル名を手動で設定することです。

シーケンスは次のようになります。

  1. 元のエンティティ名を使用して、テーブル名を新しい値に設定します。 この新しい名前が新しいエンティティに対して正しいことを確認してください。そうしないと、追加の移行が発生する可能性があります。

例: builder.Entity<OriginalEntity>().ToTable("RenamedEntity");

  1. 移行を生成します。 これにより、エンティティの正しい名前変更テーブルの移行が作成されます。
    この移行が正しいことを確認してください。 Pomelo 2.2.6を使用している場合は、 migrationBuilder.DropPrimaryKeyおよびAddPrimaryKeyエントリを確認して削除します。これらは、MySQLには不要であり、べき等SQLスクリプトの生成で問題が発生するためです。 これは3.1で修正されています。

  2. 実際のエンティティクラスの名前を変更します。

  3. 別の移行を生成して、モデルスナップショットを新しいエンティティ名で更新します。

次に、 .ToTable("RenamedEntity");を削除して、規則ベースのテーブル命名にフォールバックする場合:

  1. .ToTable("RenamedEntity");削除します。 テーブル名が正しい場合、規則に基づく名前は現在の名前と同じである必要があります。

  2. 最終的な移行を生成して、テーブルの名前が再度変更されていないことを確認します。 そうであった場合は、すべての手順を元に戻し、名前を修正して、やり直します。 移行が空の場合は、元に戻すことができます。

私はまだそれをテストしていませんが、おそらく逆の順序でこれを行うことができます。 NS:

  1. エンティティの名前を変更し、現在のテーブル名で.ToTableを追加します
  2. 移行を生成します。
  3. .ToTable属性を削除します
  4. 別の移行を生成します。

詳細については、次のスタックオーバーフローの質問を参照してください。

https://stackoverflow.com/questions/13296996/entity-framework-migrations-renaming-tables-and-columns

全てのコメント3件

これはEFの固有の制限であり、Pomeloに直接ではありません。 EFは通常、テーブルのドロップ/作成と名前変更を区別できません。

名前の変更であることを伝える秘訣は、エンティティクラスの属性を介して、またはOnModelCreating fluent APIを介して、テーブル名を手動で設定することです。

シーケンスは次のようになります。

  1. 元のエンティティ名を使用して、テーブル名を新しい値に設定します。 この新しい名前が新しいエンティティに対して正しいことを確認してください。そうしないと、追加の移行が発生する可能性があります。

例: builder.Entity<OriginalEntity>().ToTable("RenamedEntity");

  1. 移行を生成します。 これにより、エンティティの正しい名前変更テーブルの移行が作成されます。
    この移行が正しいことを確認してください。 Pomelo 2.2.6を使用している場合は、 migrationBuilder.DropPrimaryKeyおよびAddPrimaryKeyエントリを確認して削除します。これらは、MySQLには不要であり、べき等SQLスクリプトの生成で問題が発生するためです。 これは3.1で修正されています。

  2. 実際のエンティティクラスの名前を変更します。

  3. 別の移行を生成して、モデルスナップショットを新しいエンティティ名で更新します。

次に、 .ToTable("RenamedEntity");を削除して、規則ベースのテーブル命名にフォールバックする場合:

  1. .ToTable("RenamedEntity");削除します。 テーブル名が正しい場合、規則に基づく名前は現在の名前と同じである必要があります。

  2. 最終的な移行を生成して、テーブルの名前が再度変更されていないことを確認します。 そうであった場合は、すべての手順を元に戻し、名前を修正して、やり直します。 移行が空の場合は、元に戻すことができます。

私はまだそれをテストしていませんが、おそらく逆の順序でこれを行うことができます。 NS:

  1. エンティティの名前を変更し、現在のテーブル名で.ToTableを追加します
  2. 移行を生成します。
  3. .ToTable属性を削除します
  4. 別の移行を生成します。

詳細については、次のスタックオーバーフローの質問を参照してください。

https://stackoverflow.com/questions/13296996/entity-framework-migrations-renaming-tables-and-columns

基本的に、実装されているヒューリスティックがあり、_some_ケースでテーブルの名前変更を検出できます。

ただし、名前の変更はそれらの操作の1つであり、生成された移行コードを後で確認し、必要に応じてDropTableおよびCreateTable呼び出しをRenameTableに変更する必要があります。

EF Coreには、これらの自動生成された移行と同じように、テーブルの名前が変更されています。

        migrationBuilder.DropPrimaryKey(
            name: "PK_LogFieldsConfiguration",
            table: "LogFieldsConfiguration");

        migrationBuilder.RenameTable(
            name: "LogFieldsConfiguration",
            newName: "LogFieldsConfigurations");

        migrationBuilder.AddPrimaryKey(
            name: "PK_LogFieldsConfigurations",
            table: "LogFieldsConfigurations",
            column: "Id");
このページは役に立ちましたか?
0 / 5 - 0 評価