【问题标题】:Update child entities from parent entity从父实体更新子实体
【发布时间】:2019-12-05 01:47:09
【问题描述】:

根据下面的场景,我想从父实体更新子实体。

我是这样处理这个问题的。

  1. 从数据库中删除父级的子实体。
  2. 从数据库中添加父级的新子实体。

这种方法是真的吗?

    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();
    }

【问题讨论】:

    标签: c# json asp.net-mvc entity-framework asp.net-core


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 2011-12-19
    • 2021-02-09
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多