.NET Core EF新增数据时忽略Id字段致MERGE插入失败求助
解决EF Core中Shop_Empleado表Id字段未自动生成导致的插入失败问题
针对你遇到的问题,从EF Core主键生成策略和实体配置的角度,给出以下排查和解决步骤:
1. 确认实体类继承与Id属性定义
确保Shop_Empleado正确继承BaseEntity<int>并实现IAggregateRoot,实体类无需重复定义Id属性(继承自基类即可):
public class Shop_Empleado : BaseEntity<int>, IAggregateRoot { // 你的其他业务属性,比如Nombre, Cargo等 }
2. 检查实体配置类的主键生成策略
确保配置类中明确指定Id的生成策略为HiLo,并且与其他正常表的配置逻辑一致。示例配置:
public class Shop_EmpleadoConfiguration : IEntityTypeConfiguration<Shop_Empleado> { public void Configure(EntityTypeBuilder<Shop_Empleado> builder) { // 标记Id为主键 builder.HasKey(e => e.Id); // 配置HiLo序列生成,序列名称和架构要与迁移文件匹配 builder.Property(e => e.Id) .ValueGeneratedOnAdd() // 显式指定添加时自动生成值 .UseHiLo("Shop_Empleado_HiLo_Seq", "CatalogDb"); } }
注意:ValueGeneratedOnAdd()是关键,它告诉EF Core该属性在插入时由数据库或框架生成值,避免MERGE语句忽略Id字段。
3. 验证迁移文件的Id列配置
打开对应的迁移文件,确认Id列已正确关联HiLo序列,且设置为非空主键:
public partial class AddShopEmpleadoTable : Migration { protected override void Up(MigrationBuilder migrationBuilder) { // 先创建HiLo序列(如果之前没创建) migrationBuilder.CreateSequence( name: "Shop_Empleado_HiLo_Seq", schema: "CatalogDb", incrementBy: 10); migrationBuilder.CreateTable( name: "Shop_Empleado", schema: "CatalogDb", columns: table => new { Id = table.Column<int>(type: "int", nullable: false) .Annotation("SqlServer:HiLoSequenceName", "Shop_Empleado_HiLo_Seq") .Annotation("SqlServer:HiLoSchema", "CatalogDb"), // 其他列定义 }, constraints: table => { table.PrimaryKey("PK_Shop_Empleado", x => x.Id); }); } }
如果迁移文件中没有创建序列的代码,需要手动补充,或者重新生成迁移(确保配置类已正确注册)。
4. 确认DbContext已加载实体配置
在你的DbContext的OnModelCreating方法中,确保已注册Shop_Empleado的配置类:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 方式1:手动注册单个配置 modelBuilder.ApplyConfiguration(new Shop_EmpleadoConfiguration()); // 方式2:批量加载当前程序集下的所有配置类(推荐) modelBuilder.ApplyConfigurationsFromAssembly(typeof(Shop_EmpleadoConfiguration).Assembly); }
5. 检查实体添加逻辑
确保添加Shop_Empleado实体时,没有手动设置Id属性(保留默认值0即可,EF Core会通过HiLo生成正确的Id):
var nuevoEmpleado = new Shop_Empleado { Nombre = "Juan", Cargo = "Vendedor" // 不要设置Id属性 }; await _dbContext.Shop_Empleado.AddAsync(nuevoEmpleado); await _dbContext.SaveChangesAsync();
6. 重置迁移(可选)
如果以上步骤都无效,可能是迁移文件存在配置不一致,可尝试删除当前迁移文件,重新生成并应用:
# 删除错误的迁移 Remove-Migration # 重新生成迁移 Add-Migration AddShopEmpleadoTable # 应用迁移到数据库 Update-Database
内容的提问来源于stack exchange,提问作者Alexander Saavedra
相关产品推荐
相关产品推荐

