更改模型属性的数据类型而不影响数据

时间:2017-02-06 15:21:52

标签: asp.net-core asp.net-core-mvc

我们在ASP.NET MVC Core应用程序中使用Code First方法。我们有一个包含大量数据的表,我们希望将其中一个列的数据类型从string更改为int。

该列只存储两个整数,即" 1"和" 2"。我们如何使用Package Manager控制台命令(或类似的东西)来执行此操作,而不会影响数据。

因此,在以下模型中,我们需要将OrderType从字符串更改为int,而不会影响SQL Server数据库中的现有数据:

public class Order
{
    public int OrderId { set; get; }
    public string OrderType { set; get; }
    public int OrderYear { set; get; }
    public string OrderLoc { set; get; }
    ...
    ...
}

更新

我们正在使用VS2015进行最新更新。以下可能是对我们问题的更好解释:

在ASP.NET Core - Code First模型中,有时您可以对模型进行某些更改并运行迁移命令,以使更改与最初使用Code First方法创建的数据库保持同步。我正在寻找这样的迁移命令,因此如果模型属性的数据类型更改为兼容类型,则数据库表中相应列中的现有数据仍保持完整。请注意,在我们的案例中,由于列OrdererType将值1和2保持为字符串,因此现有数据类型string与数据类型int兼容。

2 个答案:

答案 0 :(得分:4)

我解决了以下问题。以下是我的观察

事实证明,在对模型进行任何更改后 - 例如添加/删除属性,更改属性的数据类型,甚至删除现有的整个模型或添加新模型 - 如果您在模型中运行以下命令Visual Studio的Package Manager控制台将创建一个新的迁移文件 - 在Visual Studio的Migrations文件夹下 - 反映这些更改。然后,当您运行下面显示的第二个命令时,所有新更改都将反映在现有数据库中(最初使用Code First方法创建)。这是模型中更改的数据类型将在相应的SQL Db中相应更改,模型中删除/添加的属性将导致相应的SQL Db中相应表中的相应列被相应地添加/删除等等。如果相应的新数据类型与旧数据类型中的旧数据兼容,则此过程中所有现有数据都将保持不变。

一切如何发生:每当我们运行add-migration命令时,Visual Studio会在数据库中创建一个名为__EFMigrationsHistory的表,用于跟踪迁移文件中创建的更改

打包管理控制台命令

  1. 第一个命令:

    PM> add-migration myNewMigration -context myWebProjContext

  2. 注意:运行上述命令时,在运行下一个更新数据库的命令反映所有更改之前,以下消息将警告您在新创建的迁移中检查更改:

    An operation was scaffolded that may result in the loss of data. Please review the migration for accuracy.
    To undo this action, use Remove-Migration.
    
    1. 第二个命令:

      PM> update-database -context myWebProjContext

    2. 例如

      在对以下模型进行以下更改并运行上述命令后,SQL Db中的Orders表的数据类型为OrderType为tinyint,并且从SQL db中删除了OrderName和OrderDesc列:

      旧模式

      public class Order
      {
          public int OrderId { set; get; }
          public string OrderType { set; get; }
          public int OrderYear { set; get; }
          public string OrderLoc { set; get; }
          public string OrderName { set; get; }
          public string OrderDesc { set; get; }
      }
      

      对上述模型的修改:这里我将OrderType的数据类型从字符串更改为字节。并删除了最后两个属性OrderNameOrderDesc

      public class Order
      {
          public int OrderId { set; get; }
          public byte OrderType { set; get; }
          public int OrderYear { set; get; }
          public string OrderLoc { set; get; }
      }
      

答案 1 :(得分:0)

基本上,您所要做的就是:

PM: Add-Migration SomeNewName

(如果'SomeNewName'已经在您的迁移文件夹中,请将其删除或提供新名称。)

PM: Update-Database