使用实体框架

时间:2015-09-03 07:29:31

标签: c# .net asp.net-mvc entity-framework

我刚刚开始学习C#& ASP.NET MVC框架和我正在尝试构建购物车功能。这是我的(添加到购物车方法)我认为应该工作,但没有。它会向购物车添加一个商品,但每当我添加另一个商品时,前一个商品就会消失。有谁知道为什么我的数据库保存不起作用?我是否以正确的方式使用上下文?

namespace e_commerse.Controllers
{
    public class ShoppingcartController : Controller
    {
            private ProductDBContext db = new ProductDBContext();

            [Authorize]
            public ActionResult addToCart(int ID)
            {
                Product product = db.Products.Find(ID);

                if (product == null)
                {
                    return HttpNotFound();
                }

                var userId =  User.Identity.GetUserId();

                IEnumerable<ShoppingCart> shoppingcarts = 
                    from cart in db.Shoppingcarts
                    where cart.userID == userId
                    select cart;

                if (!shoppingcarts.Any())
                {
                    var newShoppingcart = new ShoppingCart();
                    newShoppingcart.products = new List<Product>();
                    newShoppingcart.products.Add(product);
                    newShoppingcart.userID = userId;
                    db.Shoppingcarts.Add(newShoppingcart);
                    db.SaveChanges();
                    return View("Index", newShoppingcart);
                }

                var shoppingcart = shoppingcarts.First();

                if (shoppingcart.products == null)
                {
                    shoppingcart.products = new List<Product>();
                }

                shoppingcart.products.Add(product);
                shoppingcart.userID = userId;
                db.SaveChanges();

                return View("Index", shoppingcart);
            }

            protected override void Dispose(bool disposing)
            {
                if (disposing)
                {
                    db.Dispose();
                }
                base.Dispose(disposing);
            }
        }

        public class ProductDBContext : DbContext
        {
            public DbSet<Product> Products { get; set; }
            public DbSet<ShoppingCart> Shoppingcarts { get; set; }
        }

        public class ShoppingCart
        {
            public int ID { get; set; }
            public String userID { get; set; }
            public List<Product> products { get; set; }
        }

        public class Product
        {
            public int ID { get; set; }
            public String title { get; set; }
            public String description { get; set; }
            public decimal price { get; set; }
            public String imagepath { get; set; }
            public Type type { get; set; }
        }
    }

非常感谢每一位帮助,请原谅我的noob代码!

3 个答案:

答案 0 :(得分:3)

从db中获取ShoppingCart时,它不会获取产品列表。你的情况总是如此:

if (shoppingcart.products == null) // is always true

因此ShoppingCart.products始终为空,您创建new List<Product>()并向其添加一个产品。这就是为什么你在ShoppingCart.products列表中只有一个产品的原因。因为旧列表被new替换,只有一个项目。

您必须加载以前保存的产品,以便添加新产品。您可以使用EF lazy-loading。在您的示例中,您可以将虚拟关键字添加到products属性,以便在需要时将其加载到db:

...
public virtual List<Product> products { get; set; }

答案 1 :(得分:2)

我认为问题出在下面:

shoppingcart.products.Add(product);
shoppingcart.userID = userId;
db.SaveChanges();

您要将项目添加到局部变量,而不是上下文。您应该将代码更改为以下内容:

var newShoppingcart = new ShoppingCart();
newShoppingcart.products.Add(product);
newShoppingcart.userID = userId;
db.Shoppingcarts.Add(newShoppingcart);
db.SaveChanges();

就像你在代码中所做的那样。

答案 2 :(得分:0)

您每次都要添加相同的记录。你的陈述(观察)

  

它将一个项目添加到购物车,但每当我添加另一个项目时   前一个消失了

并非完全正确,因为您一次又一次地保存同一产品。检查您的代码,您会发现产品为

Product product = db.Products.Find(ID);

最后在底部,您再次保存相同的产品

    ......
    ......
    shoppingcart.products.Add(product);
    shoppingcart.userID = userId;
    db.SaveChanges();
    return View("Index", shoppingcart);
}

你没有做任何改变。如果一个对象具有相同的“Id”,那么它将用相同的“Id”覆盖现有的。