我们在一个ASP.NET MVC Core应用程序中使用了"代码优先"方法。我们有一个表,其中有很多数据,我们想将其中一列的数据类型从string
更改为int
。
该列只存储两个整数,即"0";1〃;以及";2〃;。我们将如何在不影响数据的情况下使用PackageManager控制台命令(或类似命令)来完成它。
因此,在以下模型中,我们需要在不影响SQL Server数据库中现有数据的情况下将OrderType
从string
更改为int
:
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
兼容。
我解决了如下问题。以下是我的观察结果:
事实证明,在对模型进行任何更改(例如添加/删除属性、更改属性的数据类型,甚至删除现有的整个模型或添加新模型)后,如果在Visual Studio的Package Manager
控制台中运行以下命令,将在Visual Studio中的Migrations文件夹下创建一个新的迁移文件,以反映这些更改。然后,当您运行下面显示的第二个命令时,所有新的更改都将反映在现有数据库中(该数据库最初是使用Code First
方法创建的)。也就是说,模型中更改的数据类型将在相应的SQL Db中相应地更改,模型中删除/添加的属性将导致相应SQL Db的相应表中的相应列相应地添加/删除,等等。在所有这些过程中,如果相应的新数据类型与旧数据类型中的旧数据兼容,则所有现有数据都将完好无损。
这一切是如何发生的:每当我们运行add-migration
命令时,Visual Studio都会在数据库中创建一个名为__EFMigrationsHistory
的表,用于跟踪迁移文件中创建的更改。
包管理控制台命令:
-
第一个命令:
PM>添加迁移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.
第二个命令:
PM>更新数据库-上下文myWebProjContext
例如
在我对以下模型进行了以下更改并运行了上述命令之后,SQL Db中的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
的数据类型从字符串更改为字节。并删除了最后两个属性OrderName
和OrderDesc
public class Order
{
public int OrderId { set; get; }
public byte OrderType { set; get; }
public int OrderYear { set; get; }
public string OrderLoc { set; get; }
}
基本上,您所要做的就是:
PM: Add-Migration SomeNewName
(如果"SomeNewName"已经在您的迁移文件夹中,请将其删除或指定一个新名称。)
PM: Update-Database