EF Core 6数据库优先插入SQL Server时默认约束值不生效问题
EF Core 6(数据库优先)插入SQL Server时默认约束不生效问题
我在使用Entity Framework Core 6的数据库优先模式向SQL Server插入数据时遇到问题:目标表的rap_number字段配置了默认约束DEFAULT (abs(checksum(newid())%(90000000))) FOR [rap_number],直接用SQL语句插入且不传入该字段时能正常生成对应值,但通过EF Core执行插入操作时,rap_number字段始终为0。
相关代码
实体类RaffelPromo
public partial class RaffelPromo { public string rap_mandt { get; set; } = null!; public int rap_id { get; set; } public int rap_sup_id { get; set; } public int rap_user_id { get; set; } public int rap_number { get; set; } public DateTime rap_date_ini { get; set; } public DateTime rap_date_end { get; set; } public bool rap_sts { get; set; } public DateTime rap_date_create { get; set; } public virtual SubclassPromo rap_ { get; set; } = null!; public virtual UserPromo rap_Navigation { get; set; } = null!; }
插入操作代码
RaffelPromo raffelPromo = RaffelPromoDTO.FromDTOToDB(raffelPromoDTOList[i]); await dbContext.RaffelPromos.AddAsync(raffelPromo); await dbContext.SaveChangesAsync();
解决方法
问题根源是EF Core会将int类型属性默认初始化为0,插入时会把这个0值发送给数据库,直接覆盖了默认约束的生效逻辑。可以通过以下方式解决:
配置EF Core识别数据库默认值
在上下文的OnModelCreating方法中,指定rap_number字段使用数据库生成的默认值:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<RaffelPromo>() .Property(p => p.rap_number) .HasDefaultValueSql("abs(checksum(newid())%(90000000))") .ValueGeneratedOnAdd(); }这样EF Core插入时不会将0值传入数据库,转而触发默认约束生成对应数值。
插入时标记字段为未修改
如果不想修改模型配置,可以在插入前手动标记rap_number为未修改状态,让EF Core生成的INSERT语句排除该字段:RaffelPromo raffelPromo = RaffelPromoDTO.FromDTOToDB(raffelPromoDTOList[i]); dbContext.Entry(raffelPromo).Property(p => p.rap_number).IsModified = false; await dbContext.RaffelPromos.AddAsync(raffelPromo); await dbContext.SaveChangesAsync();检查DTO转换逻辑
确认RaffelPromoDTO.FromDTOToDB方法没有主动给rap_number赋值为0,避免不必要的数值覆盖(但由于int是值类型默认值为0,仍需配合上述EF配置才能生效)。
内容的提问来源于stack exchange,提问作者Edgar Gomez
相关产品推荐
相关产品推荐

