我刚刚开始学习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代码!
答案 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”覆盖现有的。