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

时间:2017-07-24 17:40:12

标签: asp.net-core .net-core entity-framework-core

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

我还在使用.NET Core 1.1.0。

1 个答案:

答案 0 :(得分: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命令
  6. 从现在开始,您有两种选择:

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

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

    2. 只需从上方执行迁移脚本,无需复制__EFMigrationHistory,但您必须重复上述步骤。

    3. 另一个选择是,始终从数据库创建模型(请参阅dotnet ef dbcontext scaffold命令(请参阅EF Core Docs),以便将来从数据库模式创建模型。

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