【问题标题】:.net core: ICollection in model always empty.net 核心:模型中的 ICollection 始终为空
【发布时间】:2019-01-25 04:26:39
【问题描述】:

我正在尝试向现有模型的 ICollection 添加值,但是当我下次尝试捕获它时,我的 ICollection 为空。

有我的代码和

型号:

    public class OrderDetails
{
    [Key]
    public int OrderID { get; set; }
    public int UserID { get; set; }
    public DateTime OrderTime { get; set; }
    public double Total { get; set; }   
    public virtual ICollection<Product> Cart { get; set; }
}

}

在我的 ICollection 中输入值:

 OrderDetails order = new OrderDetails();

        order.UserID = u.ID;
        // I have tried this also:
        //
        // foreach(Product p in productsCollection)
        //{
        //    order.Cart.Add(p);
        //}
        // the productsCollection is a List that contains values...
        //
        order.Cart = productsCollection; // this is my problem
        order.OrderTime =DateTime.Now;
        order.Total = sum;
        _context.OrderDetails.Add(order);
        _context.SaveChanges();
        return Redirect("/Index");

尝试使用 OrderID 再次捕获它:

            OrderDetails orderDetails = _context.OrderDetails
                                  .Where(ood => ood.OrderID == 18)
                                  .Include("Cart")
                                  .FirstOrDefault();

有2个截图可以说明我的问题:

1) 购物车是空的: when trying to catch the cart:

2)同时dbcontext:
but when checking my dbcontext it contains the values:

** 请注意,有时购物车在计数中可能是 1、2 或 0 .. 我无法解释为什么以及何时发生这种情况。

【问题讨论】:

  • 你能把你设置 productsCollection 变量的代码贴出来

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


【解决方案1】:

可能是,您只是在混淆数字。从你的截图可以看出,OrderID 为 18 的订单有一个空的购物车; OrderID 的订单共 32 个,其购物车中有产品。

后一个订单在订单列表中的索引为 18。这与OrderID无关。

【讨论】:

    【解决方案2】:

    如果我正确理解了您的问题,您希望获得刚刚更新的值。 您可以通过在实例对象更新后调用实例对象来实现这一点,如下所示:

    OrderDetails order = new OrderDetails();
    
            order.UserID = u.ID;
            order.Cart = productsCollection;
            order.OrderTime =DateTime.Now;
            order.Total = sum;
            _context.OrderDetails.Add(order);
            _context.SaveChanges();
            var Id = order.OrderID //or whatever info you want from the updated query.
            return Redirect("/Index");
    

    希望对你有帮助。

    【讨论】:

    • 嗨。感谢您的回复。我的意思是,当我在未来某个时候尝试获取我的 ICollection 时,它将是空的(count = 0 而不是 count='num of products'
    • ICollection 的计数将与您在查询中传递的 order.Cart = productsCollection; 中的元素 productsCollection 的数量相同。因此,如果您的 productsCollection 有 0 个元素,则 cart 计数将为 0,依此类推。
    • 当然,我检查了我的 productsCollection - 当我尝试将其插入我的订单时,它包含值。购物车...也许这是一个异步调用或类似的东西?我不明白这里有什么问题......@Vinod
    • 只需在saveChanges() 之后尝试此行并检查var Id = order.OrderID 中的Id 的值,这样您就可以更清楚地发现数据是否按照您的预期更新。
    • 好的 - 我意识到我的问题:当我将产品设置到另一个 ICollection 时,它会将实例从一个带到另一个。那么现在我该怎么办?
    【解决方案3】:

    如前所述,您有两种令人困惑的不同方式将产品添加到 OrderDetails:添加到购物车,以及用不同的购物车替换购物车。最好只有一个。所以让你的实体:

    public class OrderDetails
    {
        [Key]
        public int OrderID { get; set; }
        public int UserID { get; set; }
        public DateTime OrderTime { get; set; }
        public double Total { get; set; }   
        public virtual ICollection<Product> Cart { get; } = new HashSet<Product>();
    }
    

    现在 OrderDetails 实体总是有一个购物车,它可能是空的。

    【讨论】:

      猜你喜欢
      • 2021-11-28
      • 1970-01-01
      • 2022-01-11
      • 2019-12-28
      • 2021-10-07
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多