从父实体更新子实体

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。

以上是关于从父实体更新子实体的主要内容,如果未能解决你的问题,请参考以下文章

使用 OnetoMany 关系从父类更新子类实体

核心数据从父级获取 GrandChild

弹簧数据 JPA。子实体的分页

当微风子实体更新父实体状态不改变时

如何更新CoreData中另一个实体的子实体

Spring JPA:使用更新的子实体更新实体