我将 Asp.Net MVC 5 与 Entity Framework 6 结合使用。我有一个这样的表:
public class Recipe
{
[Required]
public virtual Food Food { get; set; }
//...rest
}
现在我想将 Food
移动到食物列表中。像这样:
public class Recipe
{
public virtual IList<Food> Foods { get; set; }
//... rest
}
如果我尝试这样做并添加迁移,我将丢失与Food
ID 相关的数据。并且不知道哪种食谱适用于哪种食物。
我尝试保留 Food
并添加如下列表:
public class Recipe
{
[Required]
public virtual Food Food { get; set; }
public virtual IList<Food> Foods { get; set; }
//... rest
}
但是迁移添加了第二个外键并且无法更新。这是失败的迁移代码:
public override void Up()
{
DropForeignKey("dbo.Recipes", "Food_ID", "dbo.Foods");
DropIndex("dbo.Recipes", new[] { "Food_ID" });
AddColumn("dbo.Foods", "Recipe_Id", c => c.Int());
AddColumn("dbo.Foods", "Recipe_Id1", c => c.Int());
AlterColumn("dbo.Recipes", "Food_ID", c => c.Int());
CreateIndex("dbo.Foods", "Recipe_Id");
CreateIndex("dbo.Foods", "Recipe_Id1");
CreateIndex("dbo.Recipes", "Food_ID");
AddForeignKey("dbo.Foods", "Recipe_Id", "dbo.Recipes", "Id");
AddForeignKey("dbo.Foods", "Recipe_Id1", "dbo.Recipes", "Id");
AddForeignKey("dbo.Recipes", "Food_ID", "dbo.Foods", "ID");
}
如何在不丢失表中当前数据的情况下将单个 Food
移动到 Food
列表?
最佳答案
您需要在创建迁移后对其进行自定义。
修改你的实体类
public class Recipe { public virtual IList<Food> Foods { get; set; } //... rest }
使用
Add-Migration
构建迁移修改生成的迁移以用数据填充新列。您需要使用之前相关行的 ID 填充
Foods
中新的Recipe_Id
列。public override void Up() { DropForeignKey("dbo.Recipes", "Food_ID", "dbo.Foods"); DropIndex("dbo.Recipes", new[] { "Food_ID" }); AddColumn("dbo.Foods", "Recipe_Id", c => c.Int()); // Update values from existing data, not sure if the syntax is perfect Sql(@"UPDATE dbo.Foods SET Recipe_Id = r.Id FROM (SELECT Id, Food_ID FROM dbo.Recipes) AS r WHERE Foods.ID = r.Food_ID"); DropColumn("dbo.Recipes", "Food_ID"); CreateIndex("dbo.Foods", "Recipe_Id"); AddForeignKey("dbo.Foods", "Recipe_Id", "dbo.Recipes", "Id"); }
关于c# - 将项目移动到 Entity Framework 迁移中的项目列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30151037/