エンティティの名前を変更すると、テーブルの名前を変更するだけでなく、テーブルが削除されて作成されます。
これはEFの固有の制限であり、Pomeloに直接ではありません。 EFは通常、テーブルのドロップ/作成と名前変更を区別できません。
名前の変更であることを伝える秘訣は、エンティティクラスの属性を介して、またはOnModelCreating fluent APIを介して、テーブル名を手動で設定することです。
シーケンスは次のようになります。
例: builder.Entity<OriginalEntity>().ToTable("RenamedEntity");
移行を生成します。 これにより、エンティティの正しい名前変更テーブルの移行が作成されます。
この移行が正しいことを確認してください。 Pomelo 2.2.6を使用している場合は、 migrationBuilder.DropPrimaryKey
およびAddPrimaryKey
エントリを確認して削除します。これらは、MySQLには不要であり、べき等SQLスクリプトの生成で問題が発生するためです。 これは3.1で修正されています。
実際のエンティティクラスの名前を変更します。
別の移行を生成して、モデルスナップショットを新しいエンティティ名で更新します。
次に、 .ToTable("RenamedEntity");
を削除して、規則ベースのテーブル命名にフォールバックする場合:
.ToTable("RenamedEntity");
削除します。 テーブル名が正しい場合、規則に基づく名前は現在の名前と同じである必要があります。
最終的な移行を生成して、テーブルの名前が再度変更されていないことを確認します。 そうであった場合は、すべての手順を元に戻し、名前を修正して、やり直します。 移行が空の場合は、元に戻すことができます。
私はまだそれをテストしていませんが、おそらく逆の順序でこれを行うことができます。 NS:
.ToTable
を追加します.ToTable
属性を削除します詳細については、次のスタックオーバーフローの質問を参照してください。
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");
最も参考になるコメント
これはEFの固有の制限であり、Pomeloに直接ではありません。 EFは通常、テーブルのドロップ/作成と名前変更を区別できません。
名前の変更であることを伝える秘訣は、エンティティクラスの属性を介して、またはOnModelCreating fluent APIを介して、テーブル名を手動で設定することです。
シーケンスは次のようになります。
例:
builder.Entity<OriginalEntity>().ToTable("RenamedEntity");
移行を生成します。 これにより、エンティティの正しい名前変更テーブルの移行が作成されます。
この移行が正しいことを確認してください。 Pomelo 2.2.6を使用している場合は、
migrationBuilder.DropPrimaryKey
およびAddPrimaryKey
エントリを確認して削除します。これらは、MySQLには不要であり、べき等SQLスクリプトの生成で問題が発生するためです。 これは3.1で修正されています。実際のエンティティクラスの名前を変更します。
別の移行を生成して、モデルスナップショットを新しいエンティティ名で更新します。
次に、
.ToTable("RenamedEntity");
を削除して、規則ベースのテーブル命名にフォールバックする場合:.ToTable("RenamedEntity");
削除します。 テーブル名が正しい場合、規則に基づく名前は現在の名前と同じである必要があります。最終的な移行を生成して、テーブルの名前が再度変更されていないことを確認します。 そうであった場合は、すべての手順を元に戻し、名前を修正して、やり直します。 移行が空の場合は、元に戻すことができます。
私はまだそれをテストしていませんが、おそらく逆の順序でこれを行うことができます。 NS:
.ToTable
を追加します.ToTable
属性を削除します詳細については、次のスタックオーバーフローの質問を参照してください。
https://stackoverflow.com/questions/13296996/entity-framework-migrations-renaming-tables-and-columns