You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过ASP.NET Core发送POST请求后Sqlite未保存新项

ASP.NET Core Web API添加商品到购物车后数据未保存至SQLite的问题

已配置ASP.NET Core Web API使用SQLite作为数据库,但发送添加新项的POST请求后,商品并未保存到购物车对应的数据库记录中。

控制器POST端点代码

[HttpPost("{cartId}/items", Name = "Adding item to Cart")]
public async Task<IActionResult> PostItemToCart(Guid cartId, [FromBody] CartAddItemDTO input)
{
    var cart = await _context.Carts.Include(c => c.Items).FirstOrDefaultAsync(c => c.CartId == cartId);

    if (cart == null)
    {
        return BadRequest("The cart Id does not exist");
    }

    var product = await _context.Products
                                .FirstOrDefaultAsync(p => p.Id == input.ProductId);     

    if (product == null)
    {
        return BadRequest("The product id does not exist");
    }

    cart.Items ??= new List<Product>();
    cart.Items.Add(product);

    await _context.SaveChangesAsync();

    return Created();
}

调试情况

通过调试器逐行检查,执行SaveChangesAsync()前,购物车的Items集合已成功添加商品,但执行后数据库中购物车数据未更新。启用数据库调试后,发现最后执行的SQL仅为Product查询语句:

Executed DbCommand (1ms) [Parameters=[@__input_ProductId_0='?' (DbType = Int32)], CommandType='Text', CommandTimeout='30']
SELECT "p"."Id", "p"."CartId", "p"."Category", "p"."CurrentStock", "p"."Manufacturer", "p"."Name", "p"."Price"
FROM "Products" AS "p"
WHERE "p"."Id" = @__input_ProductId_0
LIMIT 1

预期会生成INSERT类语句,但实际未出现。推测问题出在实体关系映射或EF Core的状态跟踪上。

实体关系配置(OnModelCreating)

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{
    // Seeding some data for Product table...

    // Entity Mapping Starts here
    modelBuilder.Entity<Product>()
                .HasOne(p => p.Cart)
                .WithMany(c => c.Items)
                .HasForeignKey(p => p.CartId);

    base.OnModelCreating(modelBuilder);
}

问题原因与解决方案

原因

当前操作是将已存在的Product实体关联到Cart,而非创建新的Product记录。此时仅向Cart的Items集合添加Product,EF Core并不会自动更新Product的外键CartId,因此SaveChanges时无任何数据库更新操作(因为EF Core未检测到实体状态变化)。

解决方法

在添加商品到购物车集合后,显式更新Product的外键属性,让EF Core跟踪到实体状态变化:

cart.Items ??= new List<Product>();
cart.Items.Add(product);
// 显式设置Product的Cart外键,触发EF Core的状态跟踪
product.CartId = cartId;
// 或者直接关联Cart实体
// product.Cart = cart;

await _context.SaveChangesAsync();

此时执行SaveChangesAsync()时,EF Core会生成更新Product表CartId字段的SQL语句,完成商品与购物车的关联。

另外需要注意:此场景下不会生成INSERT语句,因为Product已存在于数据库中,我们只是修改它的关联关系,正确的预期应该是UPDATE语句。

内容的提问来源于stack exchange,提问作者antoniok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 10:45:01