2011-05-02 1 views
0

J'utilise MVC2 et je suis le tutoriel sur MvcMusicStore. Le problème est que le total ne se met pas à jour dans la table Commandes de la base de données. Chaque fois que je commande quelque chose sur le site et que je vais dans la base de données, le champ Total indique toujours 0,00. Quelqu'un a-t-il compris cela? Voici le code:Total ne pas mettre à jour sur la base de données dans le tutoriel MvcMusicStore? MVC2

public int CreateOrder(Order order) 
{ 
    decimal totalOrder = GetTotal(); 

    var cartItems = GetCartItems(); 

    //Iterate the items in the cart, adding Order Details for each 
    foreach (var cartItem in cartItems) 
    { 
     var orderDetails = new OrderDetail 
     { 
      ProductId = cartItem.ProductId, 
      OrderId = order.OrderId, 
      UnitPrice = cartItem.Product.Price, 
      Quantity = cartItem.Count 
     }; 

     cricket_Model.OrderDetails.AddObject(orderDetails); 
     totalOrder = (cartItem.Count * cartItem.Product.Price); 
    } 

    // Set the order's total to the orderTotal count 
    order.Total = totalOrder; 

    //Save the order 
    cricket_Model.SaveChanges(); 

    //Empty the shopping cart 
    EmptyCart(); 

    //Return the OrderId as a confirmation number 
    return order.OrderId; 
} 

Je veux juste dire que tout les mises à jour dans le tableau OrderDetails et tout les mises à jour dans la table Order sauf le champ Total.

+0

affiche-t-il la valeur totalOrder en mode débogage? Ne l'enregistre-t-il pas dans la base de données avec la méthode .SaveChanges() ou totalOrder lui-même est 0.00? – Priyank

Répondre

0

totalOrder devrait être (noter que le + =) dans la boucle,

totalOrder += (cartItem.Count * cartItem.Product.Price); 

En outre, il ne semble pas que vous enregistrez les changements qui totalOrder est une partie de la base de données. Parce que vous ne nous montrez pas où totalOrder est défini, c'est difficile à dire.

1

Cela a chatouillé mon cerveau aussi! J'utilise MVC3 et je me retrouve à écrire un système de commerce électronique personnalisé basé sur ce tutoriel comme je suis nouveau sur MVC3. J'ai rencontré le même problème où il Met à jour ma table de commande ainsi que la table de détail des commandes mais pas la colonne totale de la table Commande.

La solution que je suis venu avec comme suit:

l'intérieur de votre CheckoutController.cs faire le changement folowing et d'ajouter storeDB.SaveChanges(); après la CreateCard (commande); Méthode par exemple ci-dessous:

// POST: /Checkout/AddressAndPayment 

    [HttpPost] 
    public ActionResult AddressAndPayment(FormCollection values) 
    { 
     var order = new Order(); 
     TryUpdateModel(order); 

     try 
     { 
      if (string.Equals(values["PromoCode"], PromoCode, 
       StringComparison.OrdinalIgnoreCase) == false) 
      { 
       return View(order); 
      } 
      else 
      { 
       order.Username = User.Identity.Name; 
       order.OrderDate = DateTime.Now; 

       //Save Order 
       storeDB.Orders.Add(order); 
       storeDB.SaveChanges(); 

       //Process the order 
       var cart = ShoppingCart.GetCart(this.HttpContext); 
       cart.CreateOrder(order); 

       //! ADD THIS METHOD TO PERSIST DATA AGAIN! And your Total will Update. 
       storeDB.SaveChanges(); 

       return RedirectToAction("Complete", 
        new { id = order.OrderId }); 
      } 

     } 
     catch 
     { 
      //Invalid - redisplay with errors 
      return View(order); 
     } 
    } 

Cela semble un peu Dodgy/Etrange .... Si j'ajouter un point d'arrêt à l'intérieur du SaveChanges ShoppingCartModel il persiste également les données, mais si vous cochez la DB Par la suite il encore montre le total comme Null ... Le code ci-dessus résout cependant le problème ...

2

Je ne suis pas un expert chez PERSISTENCE. Mais celui-ci a chatouillé mes follicules pileux pendant deux bonnes heures. Le travail autour de qui est aussi a été posté par @Ben Pretorius

//Save Order 
storeDB.Orders.Add(order); 
storeDB.SaveChanges(); 

//Process the order 
var cart = ShoppingCart.GetCart(this.HttpContext); 
cart.CreateOrder(order); 

//! ADD THIS METHOD TO PERSIST DATA AGAIN! And your Total will Update. 
storeDB.SaveChanges(); 

Bien que nous sauvons la DB dans la méthode CreateOrder dans ShoppingCart, il a encore ordre propriété comme un élément nul.

Alors que lorsque vous retournez le contexte de la page à la AddressAndPayement ActionResult, la propriété Ordre du panier est terminée. Par conséquent, lorsque vous effectuez une sauvegarde sur la base de données dans le contrôleur , le total de la commande est enregistré.

Je suis encore en train d'essayer de le mettre à jour à partir de la méthode dans. Quelqu'un d'autre a une meilleure idée?

+0

Est-ce que quelqu'un sait pourquoi vous devez appeler storeDB.SaveChanges(); une deuxième fois (3 fois au total pour créer la commande!)? Besoin d'une réponse d'expert à ce sujet et si c'est vraiment la bonne façon de gérer cette situation. – PussInBoots

Questions connexes