使用数据迁移的Entity Framework 5迁移

4

我有一个实体,其中包含一个字符串属性,我需要将其外部化到另一组实体中:

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; }
}

如果我创建一个迁移,它会在数据库中创建新的“Color”表,然后将新列添加到“MyEntity”中。如何确保我不会失去存在于“MyEntity”中的所有字符串数据?我尝试在迁移中加载DbContext,以便根据“MyEntity”中的字符串数据创建新的“Color”实体,但由于它检测到模型与当前架构不同步,所以出现了问题。
2个回答

2
在您的项目中,转到包管理器窗口并执行以下操作:
  1. 启用迁移:Enable-Migrations
  2. 创建迁移:Add-Migration Initial
  3. 创建升级/降级脚本:Update-Database
在您的情况下,您要添加一个新表(Color)和两个新列。
如果您开始运行您的网站,FavoriteColor将被删除,包括其数据。 您可以采取以下措施: 在包管理器控制台运行Add-Migration Initial,这将创建一个新的脚本(C#文件)。如您所见,在此文件中有一个已删除的列,2个添加的列和1个表。
确保在列之前先创建表格,使用旧列的现有数据填充它,然后再删除该列。
另一种方式(也许更好)是在几个迁移脚本中执行此操作,您还可以使用Seed()方法来填充数据。

1
如果您使用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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接