2012-11-13 36 views
0

我正在挑战自己制作一个小型网上商店,但在我的数据库中存储订单时遇到问题。产品的商店清单数据库

这是我的Order类

[Key] 
    public int Id { get; set; } 
    public IEnumerable<BasketProduct> BasketProducts { get; set; } 
    public string UserName { get; set; } 

存储BasketProducts(不INT标识,它不想工作,但我不知道为什么需要它)

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(以表)仅创建ID和用户名,所以我不能获取任何产品当前人订购。

我做了什么错误,或者我失去了一些东西使它工作?提前致谢。

编辑:这是我现在得到的错误。 未将对象引用设置为对象的实例。

+0

什么是GetCurrentBasket(),它是如何填充的?您是否将您的表单从您的视图发布到您的CreateOrder()操作? –

+0

哪里发生异常? – Zabavsky

+0

GetCurrentBasket从当前会话中返回Basket对象。索引方法没有做任何特殊的处理:ActionResult Index(Order order){return View(order);} – asdewka

回答

0

它似乎是问题是当你保存到数据库。我相信在添加实体时,您会希望将它们添加到内容中的特定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 }); 
} 

我缠你Context.SaveChanges()调用在一个try/catch。我通常会这样做,如果我有一个错误保存到数据库,这样我可以调试和逐步通过它,任何数据库级别的异常将被捕获,你可以看到发生了什么。

+0

不幸的是错误保持不变。 未将对象引用设置为对象的实例。 – asdewka