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; }
}
當我運行的項目,我得到一個錯誤:
值不能爲空。參數名:源
任何人都可以告訴我怎麼解決?非常感謝你。
嗨安德斯,就像你說的。我試過從「EF Code First」轉換爲「LINQ to SQL」,這是不可能的? – thanh
這肯定是可能的,但它看起來像你不熟悉LINQ to SQL,所以你應該在嘗試轉換之前在LINQ to SQL上做一些教程,以便知道適當的LINQ to SQL代碼的樣子。 –
是的,沒錯。我不熟悉LINQ to SQL,我會了解更多。順便說一句,你有一個簡單的mvc asp.net購物車代碼?我想學習在mvc上建立一個購物車,但是我摸索起來太困難了。謝謝你的回答:) – thanh