Entity Framework Core无法保存Bit类型列的问题求助
问题:DB First模式下修改无键实体字段后SaveChanges不生效
我采用DB First方式开发,尝试修改BMTransactionEmail实体的FgSendEmail列值从false改为true,但调用SaveChanges()后该列并未成功保存。相关代码如下:
业务代码
var reportEmail = await _context.BMTransactionEmails.FirstOrDefaultAsync(a => a.TransactionID == 12854); reportEmail.FgSendEmail = true; var saved = _context.SaveChanges();
实体类定义
public partial class BMTransactionEmail { public int TransactionID { get; set; } public bool? FgSendEmail { get; set; } }
DbContext配置
modelBuilder.Entity<BMTransactionEmail>(entity => { entity.HasNoKey(); entity.ToTable("BMTransactionEmail"); });
原因分析
问题出在entity.HasNoKey()的配置上:EF Core中,无键实体(Keyless Entity)默认是只读的。EF无法跟踪无键实体的变更,也无法生成对应的UPDATE语句,所以修改字段值后调用SaveChanges()不会对数据库产生任何影响。
解决方案
方案1:为实体配置主键(推荐)
如果数据库表BMTransactionEmail本身存在主键(比如TransactionID是主键),只需修改DbContext的配置,将HasNoKey()替换为主键配置:
modelBuilder.Entity<BMTransactionEmail>(entity => { // 设置TransactionID为主键 entity.HasKey(e => e.TransactionID); entity.ToTable("BMTransactionEmail"); });
修改后重新生成实体类(DB First模式下可通过Scaffold-DbContext命令更新),之后再执行原业务代码,SaveChanges()就能正常保存变更了。
方案2:使用原始SQL执行更新(适用于表无主键的场景)
如果数据库表确实没有主键(不推荐这种设计),可以直接通过原始SQL语句执行更新操作:
var transactionId = 12854; var affectedRows = _context.Database.ExecuteSqlRaw( "UPDATE BMTransactionEmail SET FgSendEmail = 1 WHERE TransactionID = {0}", transactionId );
这种方式不需要依赖EF的实体跟踪,直接操作数据库,能确保变更生效。
内容的提问来源于stack exchange,提问作者Gino Mortillero
相关产品推荐
相关产品推荐

