gpt4 book ai didi

c# - 对象与集合的 Entity Framework 更新方法

转载 作者:行者123 更新时间:2023-11-30 14:58:39 26 4
gpt4 key购买 nike

我在更新数据库中的现有实体时遇到问题。我首先使用实体​​框架代码。

我有一个计算食物的小程序。

我的领域类>

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 可以是 Ingredient,也可以是 Recipe,所以我可以将 recipe 包含到 recipe 中。

我试过这种更新方式:

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 无法跟踪具有相同键的多个对象。

我对更新表格没问题>单位和成分,但收集让我很紧张。我已经在 pluralsight 上看过关于 EF 的视频,但没有像我这样的例子。

感谢您的帮助。

最佳答案

您在滥用 Entity Framework 的用途。通常加载实体、修改它(让附加的 DbContext 为您跟踪更改)是个好主意,然后允许它检测是否已进行更改。如果这是不可能的(我会假设你已经问过这个问题),那么最好的办法是将实体的属性从一个对象映射到另一个对象。您也需要为相关实体中的每个实体执行此操作。

public void Update(Recipe recipe)
{
if (recipe == null)
return;

var originalRecipe = DataContext.Recipes.SingleOrDefault(i => i.Id == recipe.Id);

if (originalRecipe == null)
return;

originalRecipe.Name= recipe.Name;
originalRecipe.WeightCooked = recipe.WeightCooked;
originalRecipe.IsAlsoIngredient = recipe.IsAlsoIngredient;

foreach(var item in recipe.Items)
{
var originalItem = DataContext.RecipeItems.SingleOrDefault(i=>i.Id == item.Id);
if(originalItem == null)
return;
originalItem.Quantity = item.Quantity;
...
}
DataContext.SaveChanges();
}

顺便说一句,我使用了 SingleOrDefault 而不是 FirstOrDefault

如果您想自动执行此映射,请查看类似 AutoMapper 的内容这使您可以将对象映射在一起。

关于c# - 对象与集合的 Entity Framework 更新方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18274408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com