1

DBContext コレクションにオブジェクトを追加しています。コレクションに保存する前は、そのオブジェクト内の変数はすべて正しく、保存後、VS2012 のデバッグ ツールを使用して DBContext コレクション内を調べると、オブジェクト内のすべての値が変更されていることがわかります。関連するコードは次のとおりです。

public class AdmissionsStoreEntities : DbContext
{
    public DbSet<Cart> Carts { get; set; }
    public DbSet<Order> Orders { get; set; }
    public DbSet<OrderDetail> OrderDetails { get; set; }
}

public void AddToCart(Product product)
{
    // Get the matching cart and product instances
    var cartItem = storeDB.Carts.SingleOrDefault(
        c => c.CartId == ShoppingCartId
        && c.ProductId == product.ProductId);

    if (cartItem == null)
    {
        // Create a new cart item if no cart item exists
        cartItem = new Cart
        {
            ProductId = product.ProductId,
            Product = product,
            CartId = ShoppingCartId,
            Count = 1,
            DateCreated = DateTime.Now
        };

        // storeDB is my AdmissionsStoreEntities() object.
        storeDB.Carts.Add(cartItem);
    }
    else
    {
        // If the item does exist in the cart, then add one to the quantity.
        cartItem.Count++;
    }

    // Save Changes (where the changes occur)
    storeDB.SaveChanges();
}

たとえば、cartItem オブジェクトを storeDB.Carts に保存する前の値は次のとおりです。

  • 商品ID = 5
  • レコード ID = 0
  • カウント = 1
  • Product.ProductID = 5
  • Product.CategoryID = 5

変更を保存すると、cartItem の値が変更されます (メソッドに渡された元のオブジェクトの値も変更されていることに気付きました)。その後の値は次のとおりです

  • 商品ID = 7
  • レコード ID = 9
  • カウント = 1
  • Product.ProductID = 7
  • Product.CategoryID = 7

なぜこうなった?必要に応じて、さらにコードを提供できます。

要求どおり、これが私の ShoppingCartId の取得方法です。

public ActionResult AddToCart(int id)
    {
        // Retrieve the product from our ViewData object that holds all current  data        in the SharePoint list
        var addedProduct = ((List<Product>)ViewData["AllProducts"]).Find(x => x.ProductId == id);

        // Get our cart instance.
        var cart = ShoppingCart.GetCart(this.HttpContext);

        // Add product to cart.
        cart.AddToCart(addedProduct);

        // Go back to the main store page for more shopping
        return RedirectToAction("Index");
    }

public static ShoppingCart GetCart(HttpContextBase context)
    {
        var cart = new ShoppingCart();
        cart.ShoppingCartId = cart.GetCartId(context);
        return cart;
    }

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
            {
                Guid tempCartId = Guid.NewGuid();

                context.Session[CartSessionKey] = tempCartId.ToString();
            }
        }
        return context.Session[CartSessionKey].ToString();
    }

私の Cart および ShoppingCart モデルへのリンクは、Rob の要求に従って、次のリンクにあります。

Rob が提供したデバッグ コードの結果:

4

2 に答える 2

1

編集

削除してみてくださいProduct = product:

if (cartItem == null)
    {
        // Create a new cart item if no cart item exists
        cartItem = new Cart
        {
            ProductId = product.ProductId,
            //Product = product,
            CartId = ShoppingCartId,
            Count = 1,
            DateCreated = DateTime.Now
        };

        // storeDB is my AdmissionsStoreEntities() object.
        storeDB.Carts.Add(cartItem);
    }

ProductId を設定するとうまくいくはずです。実際のオブジェクトは必要ありません。

于 2013-03-28T14:12:56.860 に答える
0

確かではありませんが、これは実質的にマルチスレッド環境 (ASP.NET) で静的ファクトリ メソッドを使用することの副作用である可能性があると思います。

ここにあなたが持っているものがあります:

public static ShoppingCart GetCart(HttpContextBase context)
{
    var cart = new ShoppingCart();
    cart.ShoppingCartId = cart.GetCartId(context);
    return cart;
}

渡すものに応じて cart.GetCartId(context) の異なる値を取得しcontextますが、これは静的メソッドであるため、メソッドとその内部変数のコピーは 1 つしかありません。2 人が同時に呼び出すと、cart.GetCartId()意図したものとは異なるショッピング カートに値が割り当てられる可能性があります。

あなたの状況でShoppingCartは、静的ファクトリメソッドの代わりに新しいコンストラクターを作成して使用します。

public ShoppingCart(HttpContextBase context)
{
    ShoppingCartId = GetCartId(context);
}
于 2013-03-28T14:44:19.013 に答える