2013-01-09 57 views
1

我使用音樂商店購物車代碼爲我的mvc項目,但我的項目使用LINQ到SQL,而不是實體框架。我已經改變了MusicStoreEntities類如下:Mvc音樂商店LINQ到SQL購物車

public class ShoppingCartEntities 
{ 
    public ShoppingCartEntities() 
    { 
    } 
    public List<h2t_Store_Product> Products { get; set; } 
    public List<Cart> Carts { get; set; } 
    public List<Order> Orders { get; set; } 
    public List<OrderDetail> OrderDetails { get; set; } 
} 

而這些是ShoppingCart.cs類:

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 && 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 => cart.CartId == ShoppingCartId 
      && cart.RecordId == id); 

     int itemCount = 0; 

     if (cartItem != null) 
     { 
      if (cartItem.Count > 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 => cart.CartId == ShoppingCartId); 

     foreach (var cartItem in cartItems) 
     { 
      storeDB.Carts.Remove(cartItem); 
     } 
     // Save changes 
     //storeDB.SaveChanges(); 
    } 
    public List<Cart> GetCartItems() 
    { 
     return storeDB.Carts.Where(
      cart => 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 => c.CartId == ShoppingCartId); 

     foreach (Cart item in shoppingCart) 
     { 
      item.CartId = userName; 
     } 
     //storeDB.SaveChanges(); 
    } 
} 

映Cart.cs類:

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; } 

} 

當我運行的項目,我得到一個錯誤:

值不能爲空。參數名:源

enter image description here

任何人都可以告訴我怎麼解決?非常感謝你。

回答

0

這不會作爲linq-to-sql運行,而是作爲linq-to-objects運行。 linq查詢的來源是ShoppingCartEntities.Carts,這是一個List<Cart>

異常消息表示執行查詢時Cartsnull。我看不到你在提供的代碼中的任何地方檢查了這個列表。

如果您試圖將其從EF Code First示例中轉換出來,很容易錯過該步驟。當使用EF Code First時,實體集會自動從基類中獲取值(可通過反射推測),但linq-to-sql中不存在「magic」。

+0

嗨安德斯,就像你說的。我試過從「EF Code First」轉換爲「LINQ to SQL」,這是不可能的? – thanh

+0

這肯定是可能的,但它看起來像你不熟悉LINQ to SQL,所以你應該在嘗試轉換之前在LINQ to SQL上做一些教程,以便知道適當的LINQ to SQL代碼的樣子。 –

+0

是的,沒錯。我不熟悉LINQ to SQL,我會了解更多。順便說一句,你有一個簡單的mvc asp.net購物車代碼?我想學習在mvc上建立一個購物車,但是我摸索起來太困難了。謝謝你的回答:) – thanh