.NET Core数据库模型在生产中的更改

mar*_*ine 1 entity-framework-core .net-core asp.net-core

我遵循代码优先方法通过EFCore生成数据库。现在在开发过程中,我的一个模型发生了变化。如何在一个客户的实时系统上更新相应的数据库表?我当然不想转储或删除任何数据。

我仍然在.NET Core 1.1.0上。

Tse*_*eng 5

我担心那时候您必须吞下药丸。

Database.EnsureCreated()仅对无需保存数据的开发有用。如果必须保留数据或更改表架构,则必须使用迁移或数据库支架(从数据库架构创建模型)。

无论如何,在应用/尝试以下步骤之前,请对生产数据进行备份,然后在登台服务器上进行尝试。

一种敏感的选择是...

  1. 还原您的代码(例如,回到VCS中的旧版本)
  2. 创建基于它的表布局(运行Add-Migration InitialVersiondotnet ef migrations add InitialVersion后跟Update-Databasedotnet ef database update
  3. 重新应用模型更改(返回到VCS中的当前版本,但将文件保留在Migration文件夹中)
  4. 运行Add-Migration ModelUpdateV2dotnet ef migrations add ModelUpdateV2
  5. 运行Script-Migration(感谢@Smit!)或 dotnet ef migrations script。这将生成一个SQL命令,用于将更改应用到架构

从现在开始,您有两种选择:

  1. 在开发数据库上的数据库中查找__EFMigrationHistory表。它应包含一个带有您的初始迁移名称的条目。将此表导出到生产系统中。然后,您的应用程序在下次启动时(在Startup.cs中调用时)应用迁移。context.Database.MigrateAsync()

    从现在开始,您将来应该可以使用迁移

  2. 只需从上方执行迁移脚本,而无需复制over __EFMigrationHistory,那么您将不得不重复上述步骤。

另一个选择是,始终从数据库创建模型(请参阅dotnet ef dbcontext scaffold命令(请参阅EF Core Docs),以后再从数据库架构中创建模型。

然后,每次更改表时,都必须创建自己的SQL进行迁移,并在部署应用程序之前或期间应用该SQL。