我有一个具有字符串属性的实体,需要将该属性外部化为另一组实体:
public class MyEntity
{
public int Id { get; set; }
public string FavoriteColor { get; set; }
}我想将此改为:
public class MyEntity
{
public int Id { get; set; }
public Color FavoriteColor { get; set; }
public int FavoriteColorId { get; set; }
}
public class Color
{
public int Id { get; set; }
public string Name { get; set; }
}如果创建迁移,它将在db中创建新的“颜色”表,然后将新列添加到"MyEntity“中。如何确保不松散"MyEntity”上以字符串形式存在的所有数据?我试图在迁移中加载DbContext,以便根据"MyEntity“中的字符串数据创建新的”颜色“实体,但由于它检测到模型与当前模式不同步,因此存在问题。
发布于 2013-09-07 10:43:45
在您的项目中,转到窗口,并:
Enable-MigrationsAdd-Migration InitialUpdate-Database在这种情况下,您将添加一个新表(Color)和两个新列。
您有理由,如果您启动您的网站,FavoriteColor将被删除,包括其数据。
你能做什么:
运行Add-Migration Initial时,在包管理器控制台中创建一个新脚本(C#文件)。正如您在这个文件中所看到的,有一个列被删除,两个被添加,一个表被创建。
确保在列之前创建表,用数据填充表,根据旧列使用现有数据创建2列,然后删除该列。
另一种方法(也许更好)是在几个迁移脚本中这样做,您也可以使用Seed()方法来填充数据。
发布于 2015-11-04 10:37:25
如果使用Add-Migration创建迁移,则迁移文件将是脚手架,如下所示:
Up()
{
CreateTable("dbo.Color"...);
DropColumn("FavoriteColor");
AddColumn("FavoriteColor", c=>Int(nullable: false));
// Some other code
}您也可以修改此文件以实现数据迁移。
Up()
{
CreateTable("dbo.Color"...);
AddColumn("FavoriteColor", c=>Int(nullable: false));
Sql("INSERT INTO dbo.Color (Id, Name) SELECT DISTINCT FavoriteColor FROM dbo.MyEntity");
// And the other data corrections here using Sql() method.
DropColumn("FavoriteColor");
// Some other code
}https://stackoverflow.com/questions/18671425
复制相似问题