我在更新数据库中的现有实体时遇到问题。我首先使用实体框架代码。
我有计算食物的小程序。
我的域类>
public class Unit
{
public int Id { get; set; }
public string Name { get; set; }
}
public abstract class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Ingredient : Item
{
public virtual Unit Unit { get; set; }
public decimal Price { get; set; }
}
public class Recipe : Item
{
public virtual List<RecipeItem> Items { get; set; }
public double WeightCoocked { get; set; }
public bool IsAlsoIngredient { get; set; }
}
public class RecipeItem
{
public int Id { get; set; }
public virtual Item Item { get; set; }
public int Quantity { get; set; }
}
请注意,RecipeItem 可以是成分,也可以是食谱,因此我可以将食谱包含在食谱中。
我尝试了这种更新方法:
public void Update1(Recipe recipe)
{
if (recipe == null)
return;
var originalRecipe = DataContext.Recipes.FirstOrDefault(i => i.Id == recipe.Id);
if (originalRecipe == null)
return;
DataContext.Entry(originalRecipe).CurrentValues.SetValues(recipe);
DataContext.SaveChanges();
}
Update1 有效,但我的收藏没有更新。
public void Update2(Recipe recipe)
{
if (recipe == null)
return;
var originalRecipe = DataContext.Recipes.FirstOrDefault(i => i.Id == recipe.Id);
if (originalRecipe == null)
return;
DataContext.Entry(originalRecipe).State = EntityState.Modified;
DataContext.SaveChanges();
}
Update1 的工作方式与 Update1 相同,但如果我更改集合,我会遇到异常。我也试过把这条线放在那里
DataContext.Entry(originalRecipe.Items).State = EntityState.Modified;
最后更新方法>
public void Update3(Recipe recipe)
{
if (recipe == null)
return;
var originalRecipe = DataContext.Recipes.FirstOrDefault(i => i.Id == recipe.Id);
if (originalRecipe == null)
return;
DataContext.Recipes.Attach(recipe);
DataContext.Entry(originalRecipe).State = EntityState.Modified;
DataContext.Entry(originalRecipe.Items).State = EntityState.Modified;
DataContext.SaveChanges();
}
获得相同的异常:ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。
我对更新表格没有问题>单位和成分,但收集让我紧张。我已经在复数视觉上观看了关于 EF 的视频,但没有像我这样的例子。
感谢您的帮助。