C# 在实体框架迁移中将项目移动到项目列表
我正在使用Asp.NETMVC5和EntityFramework6。我有一张这样的桌子:C# 在实体框架迁移中将项目移动到项目列表,c#,entity-framework,asp.net-mvc-5,C#,Entity Framework,Asp.net Mvc 5,我正在使用Asp.NETMVC5和EntityFramework6。我有一张这样的桌子: public class Recipe { [Required] public virtual Food Food { get; set; } //...rest } public class Recipe { [Required] public virtual Food Food { get; set; } public virtual IList&l
public class Recipe
{
[Required]
public virtual Food Food { get; set; }
//...rest
}
public class Recipe
{
[Required]
public virtual Food Food { get; set; }
public virtual IList<Food> Foods { get; set; }
//... rest
}
现在我想把食物
移动到食物列表中。像这样:
public class Recipe
{
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");
}
如何将单个
食物
移动到食物
列表中,而不丢失表中的当前数据?创建迁移后,您需要自定义迁移
食谱
和食品
之间的原始关系是什么?看起来您正在尝试从一对一(外键在食谱
表中)转换为一对多(外键在食品
表中)?非常感谢。工作完美无瑕。仅更正:WHERE Foods.ID=r.Food\u ID
在您的UPDATE
语句中。
public class Recipe
{
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());
// 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");
}