已定义键仍遇‘实体类型需定义主键’错误,批量添加Pick求助
解决方案
你的问题核心是把PickList当成了EF Core的实体类来操作,但它本质只是用来批量传递Pick数据的容器(DTO),不需要映射到数据库表,也不需要作为实体被EF跟踪。
修改步骤:
- 调整DbContext
移除针对PickList的DbSet,只保留Pick的DbSet:
public class DataContext : DbContext { // 保留Pick的DbSet,移除PickList的Selections public DbSet<Pick>? Picks { get; set; } // 其他上下文配置... }
- 简化PickList类
去掉无效的[Key]属性,它只是用来接收批量数据的载体:
public class PickList { public List<Pick>? Picks { get; set; } }
- 修改API接口逻辑
直接将PickList中的Picks集合批量添加到数据库,而不是添加PickList本身:
app.MapPost( "/selections", async (PickList pickList, DataContext db) => { if (pickList.Picks != null && pickList.Picks.Count > 0) { db.Picks?.AddRange(pickList.Picks); await db.SaveChangesAsync(); } return Results.Ok(); } );
错误原因说明:
- 最初报错是因为EF Core要求所有实体必须有合法主键,你用
List<Pick>作为PickList的主键完全不符合EF的主键规则。 - 设为无键实体后报错,是因为EF Core不允许跟踪无键实体(
Add操作需要跟踪实体状态),而你根本不需要把PickList存入数据库,只需要操作里面的Pick集合。
内容的提问来源于stack exchange,提问作者Ollie
相关产品推荐
相关产品推荐

