从父实体更新子实体
Posted
技术标签:
【中文标题】从父实体更新子实体【英文标题】:Update child entities from parent entity 【发布时间】:2019-12-05 01:47:09 【问题描述】:根据下面的场景,我想。
我是这样处理这个问题的。
-
从数据库中删除父级的子实体。
从数据库中添加父级的新子实体。
这种方法是真的吗?
public int SaveBasket(Addition addition)
var entity = ApplicationDbContext.Additions.Include(x => x.Basket).SingleOrDefault(x => x.AdditionId == addition.AdditionId);
//Remove Basket
if (entity.Basket.Count > 0)
foreach (var item in entity.Basket)
context.Entry(item).State = EntityState.Deleted;
ApplicationDbContext.SaveChanges();
//Add new basket entities from posting json data
entity.Basket = addition.Basket;
return ApplicationDbContext.SaveChanges();
【问题讨论】:
【参考方案1】:我认为您正在寻找以下内容:
public int SaveBasket(Addition addition)
var entity = ApplicationDbContext.Additions.Find(addition.AdditionId); // Find by primary key
//Remove Basket
if (entity.Basket.Count > 0)
entity.Basket.Clear(); // Empty out the basket
ApplicationDbContext.SaveChanges();
//Add new basket entities from posting json data
addition.Basket.ForEach(b => entity.Basket.Add(b)); // Add the items
return ApplicationDbContext.SaveChanges();
很难说出你的数据结构是什么,但这应该会有所帮助。
更新
从您的评论看来,您想删除整个 basket
记录。
public int SaveBasket(Addition addition)
var baskets = ApplicationDbContext.Basket.Where(b => b.AdditionId == addition.AdditionId);
//Remove Basket
ApplicationDbContext.Basket.RemoveRange(baskets);
ApplicationDbContext.SaveChanges();
ApplicationDbContext.Basket.AddRange(addition.Basket);
return ApplicationDbContext.SaveChanges();
【讨论】:
篮子空了 我包含了购物篮实体,然后我尝试调试,entity.Basket.Clear();只需删除 Basket entityt 上的列值,因此不会完全删除。 所以你必须删除购物篮实体? 是的,我必须删除它,我有订单屏幕,我称之为购物篮。我可以在购物篮中添加和删除产品。每次添加或删除篮子时,我都必须清空篮子,因为它会给出相同的 ID 错误。例如,我在购物篮中添加了 2 个相同的产品,然后重新进入购物篮,减少或增加产品数量,并发送它以更新信息。我先清空篮子,然后添加传入数据,如果我不这样做,我会得到相同的身份错误。 那么您可能需要考虑进行比较和更新,而不是全部清除然后重新添加。可能按项目 ID 和计数。【参考方案2】:根据您的模型的外观,您也许可以这样做来删除和添加子项。
public int SaveBasket(Addition addition)
var dbAddition = ApplicationDbContext.Additions
.Include(x => x.Basket)
.SingleOrDefault(x => x.AdditionId == addition.AdditionId);
ApplicationDbContext.Basket.RemoveRange(dbAddition.Basket);
ApplicationDbContext.Basket.AddRange(addition.Basket);
return ApplicationDbContext.SaveChanges();
【讨论】:
removerange 不是 dbAddition 的函数 你说得对,我有点太快了。应该在 ApplicationDbContext.Basket 上调用 RemoveRange 和 AddRange。以上是关于从父实体更新子实体的主要内容,如果未能解决你的问题,请参考以下文章