我正在挑战自己制作一个小型网店,但在我的数据库中存储订单时遇到了问题。
这是我的订单类
[Key]
public int Id { get; set; }
public IEnumerable<BasketProduct> BasketProducts { get; set; }
public string UserName { get; set; }
存储BasketProducts(没有int Id它不想工作,但我不知道它为什么需要它)
public int Id { get; set; }
public Product Product { get; set; }
public int Quantity { get; set; }
在BasketController中,如果用户点击结帐,我想创建一个订单并将其放入数据库
public ActionResult CreateOrder()
{
//GetCurrentBasket returns a basket of current session
var baskItems = GetCurrentBasket().Items;
Order order = new Order { BasketProducts = baskItems, UserName = User.Identity.Name };
EFDbContext ent = new EFDbContext();
ent.Orders.Add(order);
ent.SaveChanges();
return RedirectToAction("Index", "Checkout", new { order = order });
}
在结帐索引方法中,它应该只接受Order对象并显示其中的所有产品
@model Domain.Elements.Order
//some code omitted
@foreach (var item in Model.BasketProducts)
{
<p>@item.Product.Name</p>
<p>@item.Quantity</p>
}
问题在于我的DB(在Order表中)它只创建Id和UserName,因此我无法检索当前订购的任何产品。
我做了什么错误,或者我错过了让它发挥作用的东西?提前谢谢。
编辑:这是我现在得到的错误。 对象引用未设置为对象的实例。
答案 0 :(得分:-1)
似乎问题是当您保存到数据库时。我相信在添加实体时,您需要将它们添加到内容的特定DbSet中。 尝试这样的事情:
public ActionResult CreateOrder()
{
//GetCurrentBasket returns a basket of current session
var baskItems = GetCurrentBasket().Items;
var context = new EFDbContext();
var orders = context.GetDbSet<Order>();
var order = orders.Create(); //use the DbSet to create your new entity
order.BasketProducts = baskItems;
order.UserName = User.Identity.Name;
orders.Add(order);
try
{
context.SaveChanges();
}
catch(DatabaseException ex)
{
}
return RedirectToAction("Index", "Checkout", new { order = order });
}
我已经在try / catch中包装了Context.SaveChanges()调用。我通常会这样做,如果我有一个错误保存到数据库,这样我可以调试并逐步执行它,任何数据库级异常将被捕获,你可以看到发生了什么。