title: Mvc music store linq to sql shopping cart
body: <p>I use Music store shopping cart code for my mvc project, but my project using linq to sql, not entity framework. I have changed the MusicStoreEntities class as following:</p>
  
  <pre><code>public class ShoppingCartEntities
  {
      public ShoppingCartEntities()
      {
      }
      public List&lt;h2t_Store_Product&gt; Products { get; set; }
      public List&lt;Cart&gt; Carts { get; set; }
      public List&lt;Order&gt; Orders { get; set; }
      public List&lt;OrderDetail&gt; OrderDetails { get; set; }
  }
  </code></pre>
  
  <p>And these is ShoppingCart.cs class:</p>
  
  <pre><code>public class ShoppingCart
  {
      ShoppingCartEntities storeDB = new ShoppingCartEntities();
      string ShoppingCartId { get; set; }
      public const string CartSessionKey = "CartId";
      public static ShoppingCart GetCart(HttpContextBase context)
      {
          var cart = new ShoppingCart();
          cart.ShoppingCartId = cart.GetCartId(context);
          return cart;
      }
      // Helper method to simplify shopping cart calls
      public static ShoppingCart GetCart(Controller controller)
      {
          return GetCart(controller.HttpContext);
      }
      public void AddToCart(h2t_Store_Product product)
      {
          // Get the matching cart and album instances
          var cartItem = (from data in storeDB.Carts
                          where data.CartId == ShoppingCartId &amp;&amp; data.ProductID == product.ID
                          select data).Single();
  
          if (cartItem == null)
          {
              // Create a new cart item if no cart item exists
              cartItem = new Cart
              {
                  ProductID = product.ID,
                  CartId = ShoppingCartId,
                  Count = 1,
                  DateCreated = DateTime.Now
              };
              storeDB.Carts.Add(cartItem);
          }
          else
          {
              // If the item does exist in the cart, 
              // then add one to the quantity
              cartItem.Count++;
          }
          // Save changes
          //storeDB.SaveChanges();
      }
      public int RemoveFromCart(int id)
      {
          // Get the cart
          var cartItem = storeDB.Carts.Single(
              cart =&gt; cart.CartId == ShoppingCartId
              &amp;&amp; cart.RecordId == id);
  
          int itemCount = 0;
  
          if (cartItem != null)
          {
              if (cartItem.Count &gt; 1)
              {
                  cartItem.Count--;
                  itemCount = cartItem.Count;
              }
              else
              {
                  storeDB.Carts.Remove(cartItem);
              }
              // Save changes
              // storeDB.SaveChanges();
          }
          return itemCount;
      }
      public void EmptyCart()
      {
          var cartItems = storeDB.Carts.Where(
              cart =&gt; cart.CartId == ShoppingCartId);
  
          foreach (var cartItem in cartItems)
          {
              storeDB.Carts.Remove(cartItem);
          }
          // Save changes
          //storeDB.SaveChanges();
      }
      public List&lt;Cart&gt; GetCartItems()
      {
          return storeDB.Carts.Where(
              cart =&gt; cart.CartId == ShoppingCartId).ToList();
      }
      public int GetCount()
      {
          // Get the count of each item in the cart and sum them up
          int? count = (from cartItems in storeDB.Carts
                        where cartItems.CartId == ShoppingCartId
                        select (int?)cartItems.Count).Sum();
          // Return 0 if all entries are null
          return count ?? 0;
      }
      public decimal GetTotal()
      {
          // Multiply album price by count of that album to get 
          // the current price for each of those albums in the cart
          // sum all album price totals to get the cart total
          decimal? total = (from cartItems in storeDB.Carts
                            where cartItems.CartId == ShoppingCartId
                            select (int?)cartItems.Count *
                            cartItems.product.UnitPrice).Sum();
  
          return total ?? decimal.Zero;
      }
      public int CreateOrder(Order order)
      {
          decimal orderTotal = 0;
  
          var cartItems = GetCartItems();
          // Iterate over the items in the cart, 
          // adding the order details for each
          foreach (var item in cartItems)
          {
              var orderDetail = new OrderDetail
              {
                  AlbumId = item.ProductID,
                  OrderId = order.OrderId,
                  UnitPrice = item.product.UnitPrice,
                  Quantity = item.Count
              };
              // Set the order total of the shopping cart
              orderTotal += (item.Count * item.product.UnitPrice);
  
              storeDB.OrderDetails.Add(orderDetail);
  
          }
          // Set the order's total to the orderTotal count
          order.Total = orderTotal;
  
          // Save the order
          //storeDB.SaveChanges();
          // Empty the shopping cart
          EmptyCart();
          // Return the OrderId as the confirmation number
          return order.OrderId;
      }
      // We're using HttpContextBase to allow access to cookies.
      public string GetCartId(HttpContextBase context)
      {
          if (context.Session[CartSessionKey] == null)
          {
              if (!string.IsNullOrWhiteSpace(context.User.Identity.Name))
              {
                  context.Session[CartSessionKey] =
                      context.User.Identity.Name;
              }
              else
              {
                  // Generate a new random GUID using System.Guid class
                  Guid tempCartId = Guid.NewGuid();
                  // Send tempCartId back to client as a cookie
                  context.Session[CartSessionKey] = tempCartId.ToString();
              }
          }
          return context.Session[CartSessionKey].ToString();
      }
      // When a user has logged in, migrate their shopping cart to
      // be associated with their username
      public void MigrateCart(string userName)
      {
          var shoppingCart = storeDB.Carts.Where(
              c =&gt; c.CartId == ShoppingCartId);
  
          foreach (Cart item in shoppingCart)
          {
              item.CartId = userName;
          }
          //storeDB.SaveChanges();
      }
  }
  </code></pre>
  
  <p>Anh Cart.cs class:</p>
  
  <pre><code>public class Cart
  {
      [Key]
      public int RecordId { get; set; }
      public string CartId { get; set; }
      public int ProductID { get; set; }
      public int Count { get; set; }
      public System.DateTime DateCreated { get; set; }
      public virtual h2t_Store_Product product { get; set; }
  
  }
  </code></pre>
  
  <p>When i run project, i get an error:</p>
  
  <p>Value cannot be null. Parameter name: source</p>
  
  <p><img src="https://i.stack.imgur.com/DVnFD.jpg" alt="enter image description here"></p>
  
  <p>Anyone can show me how to fix it? Thank you very much.</p>