【问题标题】:Changing data type of a model property without affecting data在不影响数据的情况下更改模型属性的数据类型
【发布时间】:2021-09-03 22:33:45
【问题描述】:

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

该列仅存储两个整数,即“1”和“2”。我们将如何在不影响数据的情况下使用包管理器控制台命令(或类似的命令)来完成。

因此,在以下模型中,我们需要将 OrderTypestring 更改为 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 兼容。

【问题讨论】:

  • “不影响现有数据”到底是什么意思?您不能更改数据库列的类型并将该列的值单独保留在现有行中。
  • @CodeCaster 我添加了一个新的更新部分,可以回答您的问题。我还注意到您对我的问题的编辑可能使我的问题有所改善。

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


【解决方案1】:

我按如下方式解决了这个问题。以下是我的观察

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

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

包管理控制台命令

  1. 第一个命令:

    PM> add-migration myNewMigration -context myWebProjContext

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

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> 更新数据库-context myWebProjContext

例如

在我对以下模型进行以下更改并运行上述命令后,SQL 数据库中的 Orders 表的数据类型为 OrderType 为 tinyint,并且从 SQL 数据库中删除了 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; }
}

【讨论】:

    【解决方案2】:

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

    PM: Add-Migration SomeNewName

    (如果“SomeNewName”已在您的迁移文件夹中,请将其删除或重新命名。)

    PM: Update-Database
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多