我们在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
兼容。
答案 0 :(得分:4)
我解决了以下问题。以下是我的观察:
事实证明,在对模型进行任何更改后 - 例如添加/删除属性,更改属性的数据类型,甚至删除现有的整个模型或添加新模型 - 如果您在模型中运行以下命令Visual Studio的Package Manager
控制台将创建一个新的迁移文件 - 在Visual Studio的Migrations文件夹下 - 反映这些更改。然后,当您运行下面显示的第二个命令时,所有新更改都将反映在现有数据库中(最初使用Code First
方法创建)。这是模型中更改的数据类型将在相应的SQL Db中相应更改,模型中删除/添加的属性将导致相应的SQL Db中相应表中的相应列被相应地添加/删除等等。如果相应的新数据类型与旧数据类型中的旧数据兼容,则此过程中所有现有数据都将保持不变。
一切如何发生:每当我们运行add-migration
命令时,Visual Studio会在数据库中创建一个名为__EFMigrationsHistory
的表,用于跟踪迁移文件中创建的更改
打包管理控制台命令:
第一个命令:
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.
第二个命令:
PM> update-database -context myWebProjContext
例如
在对以下模型进行以下更改并运行上述命令后,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
的数据类型从字符串更改为字节。并删除了最后两个属性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; }
}
答案 1 :(得分:0)
基本上,您所要做的就是:
PM: Add-Migration SomeNewName
(如果'SomeNewName'已经在您的迁移文件夹中,请将其删除或提供新名称。)
PM: Update-Database