获取orderID然后使用它来插入订单项(创建订单功能)

时间:2017-02-12 09:42:49

标签: asp.net-mvc

我在网上看到下面的代码,它使用以下技术一次性插入订单和订单商品。

  Models.ShopDBEntities db = new ShopDBEntities();

   public IEnumerable<Basket> GetList()
    {
        return db.Baskets.Where(x => x.UserName == UserName);
    }

  public void CreateOrder(Models.Order order)
    {
        foreach (var b in GetList())
        {
            OrderItem oi = new OrderItem()
            {
                Price = b.Product.Price,
                ProductID = b.ProductID
            };
            order.OrderItems.Add(oi);
        }
        db.Orders.Add(order);
        db.SaveChanges();

        ClearBasket();
    }
对我来说理解这一点有点困难。在我们必须拥有orderID之前,我理解在订单商品中插入记录。现在我正在寻找另一种更容易理解的方法,并逐步显示CreateOrder函数。

1-首先在订单表中插入记录并保存。

2-然后获取插入订单的orderID并使用它来插入和保存订单商品。

1 个答案:

答案 0 :(得分:1)

  

我理解在订单商品中插入记录,[首先]我们必须有orderID

没有。数据库可以,但实体框架透明地为您处理。

您显示的代码会将订单商品行添加到订单中,然后在一个交易中插入订单和订单商品行。

首先插入订单,获取自动生成的主键并在插入订单项行时使用它。

这是因为实体框架通过对象引用看到添加到上下文的OrderItem与添加的Order包含的OrderItem相同。

事实上,因为实体框架是一个应该隐藏数据库模式相对复杂性的ORM,所以订单项甚至不需要暴露OrderId属性:包含它们的实体给出实体框架有足够的信息可以使用。

如果你希望看到在不同的步骤中发生了什么,它会像这样保存订单:

var order = new Order
{
    Description = "Example order"
};

db.Orders.Add(order);   
db.SaveChanges();

现在SaveChanges()order.Id属性被赋予主键,您可以使用该键来添加订单项行:

var orderItem1 = new OrderItem
{
    OrderId = order.Id,
    Description = "Order 1 Item 1"
};
var orderItem2 = new OrderItem
{
    OrderId = order.Id,
    Description = "Order 1 Item 2"
};
var orderItem3 = new OrderItem
{
    OrderId = order.Id,
    Description = "Order 1 Item 3"
};

db.OrderItems.Add(orderItem1);
db.OrderItems.Add(orderItem2);
db.OrderItems.Add(orderItem3);
db.SaveChanges();