【发布时间】:2013-08-16 13:24:32
【问题描述】:
我在更新数据库中的现有实体时遇到问题。我首先使用实体框架代码。
我有计算食物的小程序。
我的域类>
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 的视频,但没有像我这样的例子。
感谢您的帮助。
【问题讨论】:
标签: c# .net entity-framework ef-code-first code-first