如何使用实体框架核心更改表中的列类型

时间:2021-04-11 13:53:48

标签: entity-framework-core

嗨,我使用实体框架核心和代码优先方法创建了我的数据库。现在列类型从 int 更改为 varchar/string?我可以从数据库本身更改列,但我的理解是这不是一个好主意并且会产生问题。我搜索了但我没有在网上得到实体框架核心的答案。

2 个答案:

答案 0 :(得分:1)

您可以使用 add-migration 命令修改您的数据库架构以匹配您的域模型。 将 c# 类上的属性类型从 int 更改为 string 后,只需运行

add-migration <SomeDescriptiveName>

创建迁移文件后,您可以使用 update-database 命令应用它们。

您可以阅读有关迁移的更多信息 here

答案 1 :(得分:1)

您应该使用 EF Core migrations 来更新您的数据库架构。文档很不错,所以一定要通读一遍。

但是,这是流程的摘要:

  1. 在您的模型中进行更改(按照惯例会自动检测到更改。或者,在您的数据库上下文 OnCreate 方法或 EntityConfiguration 中使用 Fluent API)。
  2. 添加运行以下 CLI 命令的迁移:dotnet ef migrations add SomeDescriptiveNameAboutWhatThisMigrationWillDo
  3. 将自动生成带有 UpDown 方法的迁移文件。 Up 将在您应用迁移时运行,如果您决定还原它,则 Down 将运行。您可以向自动搭建的迁移文件添加更改。然后,EF Core 将根据迁移文件中的代码生成 SQL 脚本并将更改应用于数据库。
  4. 添加(并且可能编辑)迁移文件后,您需要将其应用到数据库。您可以通过运行 dotnet ef migrations update 来做到这一点。
  5. EF Core 跟踪数据库中默认调用的表中所有应用的迁移__EFMigrationsHistory

在更改列类型的特定情况下,EF Core 可能会尝试删除该列并重新创建它,这将导致数据丢失。如果您想保留数据,我建议更改迁移脚本以将过程实际分为两部分:首先添加一个具有新类型和稍微不同名称的新列,然后编写一些自定义 SQL 以将数据从旧列迁移到新列,然后删除旧列,最后将新列重命名为正确的名称。老实说,我不确定是否有一些自定义迁移操作可以开箱即用地更改数据类型而不会丢失数据,可能会有。

要仔细检查迁移是否会导致数据丢失或检查它是否会执行您期望的操作,您可以通过运行 dotnet ef migrations script <from migration> <to migration> 生成将使用的 SQL 脚本。查看之后,您可以复制/粘贴并在数据库中运行脚本,或者只运行上面第 4 步中详述的命令。