嗨,我使用实体框架核心和代码优先方法创建了我的数据库。现在列类型从 int 更改为 varchar/string?我可以从数据库本身更改列,但我的理解是这不是一个好主意并且会产生问题。我搜索了但我没有在网上得到实体框架核心的答案。
答案 0 :(得分:1)
您可以使用 add-migration 命令修改您的数据库架构以匹配您的域模型。 将 c# 类上的属性类型从 int 更改为 string 后,只需运行
add-migration <SomeDescriptiveName>
创建迁移文件后,您可以使用 update-database 命令应用它们。
您可以阅读有关迁移的更多信息 here。
答案 1 :(得分:1)
您应该使用 EF Core migrations 来更新您的数据库架构。文档很不错,所以一定要通读一遍。
但是,这是流程的摘要:
OnCreate
方法或 EntityConfiguration
中使用 Fluent API)。dotnet ef migrations add SomeDescriptiveNameAboutWhatThisMigrationWillDo
。Up
和 Down
方法的迁移文件。 Up
将在您应用迁移时运行,如果您决定还原它,则 Down
将运行。您可以向自动搭建的迁移文件添加更改。然后,EF Core 将根据迁移文件中的代码生成 SQL 脚本并将更改应用于数据库。dotnet ef migrations update
来做到这一点。__EFMigrationsHistory
在更改列类型的特定情况下,EF Core 可能会尝试删除该列并重新创建它,这将导致数据丢失。如果您想保留数据,我建议更改迁移脚本以将过程实际分为两部分:首先添加一个具有新类型和稍微不同名称的新列,然后编写一些自定义 SQL 以将数据从旧列迁移到新列,然后删除旧列,最后将新列重命名为正确的名称。老实说,我不确定是否有一些自定义迁移操作可以开箱即用地更改数据类型而不会丢失数据,可能会有。
要仔细检查迁移是否会导致数据丢失或检查它是否会执行您期望的操作,您可以通过运行 dotnet ef migrations script <from migration> <to migration>
生成将使用的 SQL 脚本。查看之后,您可以复制/粘贴并在数据库中运行脚本,或者只运行上面第 4 步中详述的命令。