挣扎于在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; }
}
}
每一个帮助是深深的感谢和原谅我的新手代码!
当您从数据库中获取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'覆盖现有的