我刚刚开始学习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代码!
当您ShoppingCart
从数据库中获取数据时,它不会获取产品列表。您的条件始终为真:
if (shoppingcart.products == null) // is always true
因此ShoppingCart.products
,始终为null,您会创建new List<Product>()
一个产品并将其添加到其中。这就是为什么ShoppingCart.products
列表中只有一种产品。因为旧列表仅由一项替换为新列表。
您必须先加载先前保存的产品,然后才能添加新产品。您可以使用EF延迟加载。在您的示例中,您可以向products
属性添加virtual关键字,以在需要时从db将其加载:
...
public virtual List<Product> products { get; set; }
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句