挣扎于在ASP中保存数据到数据库.. NET MVC与实体框架

本文关键字:NET 数据库 MVC 框架 实体 数据 ASP 保存 挣扎 | 更新日期: 2023-09-27 18:11:09

我刚开始学习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; }
        }
    }

每一个帮助是深深的感谢和原谅我的新手代码!

挣扎于在ASP中保存数据到数据库.. NET MVC与实体框架

当您从数据库中获取ShoppingCart时,它不会获取产品列表。你的条件总是为真:

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

所以ShoppingCart.products总是空的,你创造了new List<Product>()并向它添加了一个产物。这就是为什么你在ShoppingCart.products列表中只有一个产品。因为旧的列表被只包含一项的新列表所取代。

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

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

我认为问题出在下面:

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

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

它将一个项目添加到购物车中,但是每当我添加另一个项目时前一个不见了

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

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

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

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

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