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.DropPrimaryKeyAddPrimaryKey条目并删除它们,因为这些对于 MySQL 不是必需的,并且会导致生成幂等 SQL 脚本时出现问题。 这在 3.1 中已修复。

  2. 重命名实际的实体类。

  3. 生成另一个迁移以使用新实体名称更新模型快照。

如果您想删除.ToTable("RenamedEntity");以回退到基于约定的表命名:

  1. 删除.ToTable("RenamedEntity"); 。 如果表名正确,则基于约定的名称应与当前名称相同。

  2. 生成最终迁移以验证表未再次重命名。 如果是,请还原所有步骤,更正名称,然后重做。 如果迁移为空,您可以将其还原。

我还没有测试它,但你可以按照相反的顺序来做。 IE:

  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.DropPrimaryKeyAddPrimaryKey条目并删除它们,因为这些对于 MySQL 不是必需的,并且会导致生成幂等 SQL 脚本时出现问题。 这在 3.1 中已修复。

  2. 重命名实际的实体类。

  3. 生成另一个迁移以使用新实体名称更新模型快照。

如果您想删除.ToTable("RenamedEntity");以回退到基于约定的表命名:

  1. 删除.ToTable("RenamedEntity"); 。 如果表名正确,则基于约定的名称应与当前名称相同。

  2. 生成最终迁移以验证表未再次重命名。 如果是,请还原所有步骤,更正名称,然后重做。 如果迁移为空,您可以将其还原。

我还没有测试它,但你可以按照相反的顺序来做。 IE:

  1. 重命名实体,并添加.ToTable当前表名
  2. 生成迁移。
  3. 删除.ToTable属性
  4. 生成另一个迁移。

有关更多信息,请参阅此堆栈溢出问题:

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

基本上,已经实现了启发式方法,可以在_某些_情况下检测表重命名。

但重命名是其中一种操作,您肯定希望事后检查生成的迁移代码,并在必要时将DropTableCreateTable调用更改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 等级