我在网上看到下面的代码,它使用以下技术一次性插入订单和订单商品。
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并使用它来插入和保存订单商品。
答案 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();