1

私は MVC プロジェクトにミュージック ストアのショッピング カート コードを使用していますが、エンティティ フレームワークではなく linq to sql を使用しているプロジェクトです。MusicStoreEntities クラスを次のように変更しました。

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

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

}

プロジェクトを実行すると、エラーが発生します。

値を null にすることはできません。パラメータ名: ソース

ここに画像の説明を入力

誰でもそれを修正する方法を教えてもらえますか? どうもありがとうございました。

4

1 に答える 1

0

これは、linq-to-sql としてではなく、linq-to-objects として実行されます。linq クエリのソース ShoppingCartEntities.Cartsは、List<Cart>.

例外メッセージは、それがクエリの実行中であることを示してCartsnullます。提供されたコードのどこにもそのリストをインスタンス化していることがわかりません。

これを EF Code First の例から変換しようとした場合、そのステップを見逃しがちです。EF Code First を使用すると、エンティティ セットは基本クラスから値を自動的に取得します (リフレクションによって推定される) が、その「魔法」は linq-to-sql には存在しません。

于 2013-01-09T06:51:07.080 に答える