重复的主密钥数据库条目 mysql 错误为 .netcore 应用程序



我是Web应用程序级编码的新手。我一直在从事电子商务类型的项目。我遇到的挑战是将产品添加到购物车,然后将更改保存到数据库。我不断收到重复的主键输入错误。我的第一个方法是按用户将选定的产品保存到会话,通过复杂类型的序列化获得独特的用户体验。然后,我尝试将保存和购物车方法添加到我的模型中,但仍然遇到相同的错误。有没有办法设计我的上下文,这样就不会有重复,或者我的模型是错误的?请帮忙。

这是我代码的一部分: 模型:

{
public class User: IdentityUser
{
public string Name {get; set;}
public DateTime CreatedAt {get; set;}
[NotMapped]
[DataType(DataType.Password)]
public string Password {get; set;}
}
public class ShippingInformation
{
[Key]
public string ShippingInformationId {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public string Address {get; set;}
public string Address2 {get; set;}
public string City {get; set;}
public string ZipCode {get; set;}
public string State {get; set;}
}
public class Product
{
[Key]
public int ProductId {get; set;}
public int InitialQuantity {get; set;}
public int Price {get; set;}
public string Title {get; set;}
public string Image {get; set;}
public string Description {get; set;}
[NotMapped]
public int Quantity {get; set;}
}
public class CartItem
{
[Key]
public int CartItemId {get; set;}
public string UserId {get; set;}
[ForeignKey("Product")]
public string ShoppingCartId {get; set;}
public User customer {get; set;}
public Product product {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public string Address {get; set;}
public string Address2 {get; set;}
public string City {get; set;}
public string ZipCode {get; set;}
public string State {get; set;}
public int Quantity {get; set;}
}
public class ShoppingCart
{
private MyContext _dbcontext;
public ShoppingCart(MyContext mycontext)
{
_dbcontext=mycontext;
}
public string ShoppingCartId {get; set; }
public List<CartItem> MyCart {get; set;}
public ShoppingCart GetCart(HttpContext services)
{
ISession session=services.Session;
string cartid=session.GetString("CartId")??Guid.NewGuid().ToString();
session.SetString("CartId", cartid);
return  new ShoppingCart(_dbcontext){ShoppingCartId=cartid};
}
public ShoppingCart GetCart(Controller controller)
{
return GetCart(controller.HttpContext);
}
public void AddToCart(Product product, int quantity)
{
var cartitem=_dbcontext.cartitems
.FirstOrDefault(n=>n.product.ProductId==product.ProductId && n.ShoppingCartId==ShoppingCartId);
if (cartitem==null)
{
cartitem=new CartItem
{ShoppingCartId=ShoppingCartId, product=product, Quantity=1};
_dbcontext.cartitems.Add(cartitem);
}
else
{
cartitem.Quantity++;
}
_dbcontext.SaveChanges();
}
public List<CartItem> GetCartItems()
{
var ShoppingCartItems=
_dbcontext.cartitems.Include(y=>y.product).
Where(d=>d.ShoppingCartId==ShoppingCartId).ToList();
return ShoppingCartItems;
}
}

public class OrderItem
{
public int Order  {get; set;}
public string Customer {get; set;}
public string Item {get; set;}
public string Product {get; set;}
}

控制器:

{
public class ShoppingCartController: Controller
{
private readonly MyContext dbcontext;
private readonly ShoppingCart mycart;
public ShoppingCartController(MyContext context, ShoppingCart shoppingCart)
{
dbcontext=context;
mycart=shoppingCart;
}
[Route("Index")]
[HttpGet]
public IActionResult Index()
{
var items=mycart.GetCartItems();
return View(items);
}
[Route("addtocart")]
[HttpPost]
public IActionResult AddToCart(Product n)
{
var cart= mycart.GetCart(this);
cart.AddToCart(n, n.Quantity);
return RedirectToAction("Checkout");
}
[Authorize]  
[Route("checkout")]
[HttpGet]
public IActionResult Checkout()
{
ViewBag.purchases=mycart.GetCartItems();
return View();
}

启动:

{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyContext>(options => options.UseMySql(Configuration["DBInfo:ConnectionString"]));
services.AddIdentity<User, IdentityRole>()
.AddEntityFrameworkStores<MyContext>()
.AddDefaultTokenProviders();
services.Configure<StripeSettings>(Configuration.GetSection("Stripe"));
services.AddScoped<HttpContextAccessor>();
services.AddSingleton<HttpContextAccessor>();
services.AddMemoryCache();
services.AddSession();            
services.AddMvc();
services.AddAuthentication();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
StripeConfiguration.SetApiKey(Configuration.GetSection("Stripe")["SecretKey"]);
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseSession();
app.UseStaticFiles();
//InitializeRoles(app.ApplicationServices).Wait();
app.UseAuthentication();
app.UseMvc();
}

解决方案实际上非常简单。因此,在尝试修改我的模型和关系但没有成功之后,我为产品(订单和其他表(设置的关系是这样的,当我使用"dbcontext.orders.add......"方法将新订单输入数据库时,将再次创建购物车中添加的现有产品项。实体框架仍将尝试在关系中为产品表输入新记录。我通过使用更新方法更正了此问题:"dbcontext.orders.update.....">

最新更新