EF Core中如何使用backingfield存储数据,解决InvestmentEth值为0的问题
问题核心原因
- 你配置了
UsePropertyAccessMode.Field,EF Core读写InvestmentEth属性时会直接操作私有字段_investmentEth,完全不走属性的get/set方法,你写在set里的计算逻辑永远不会被触发。 InvestmentEth的setter逻辑本身有错误:你把计算结果赋值给了set方法的默认参数value,而不是赋值给_backing field_investmentEth,就算set被调用也不会生效。
解决方案(分两种场景)
场景1:需要将InvestmentEth的值持久化存储到数据库
修改实体类逻辑,将计算逻辑放到Investment的setter中,每次Investment更新时自动计算_investmentEth,同时把InvestmentEth改为只读属性避免外部误写:
public class InvestorsLottery : Lottery { private decimal _investment; [Column(TypeName = "decimal(14, 2)")] public decimal Investment { get => _investment; set { _investment = value; // 每次Investment变更时自动重新计算InvestmentEth _investmentEth = _investment / EthPrice; } } [Required] public int Percentage { get; set; } [Required] [Column(TypeName = "decimal(30, 18)")] // 去掉setter,改为只读属性 public decimal InvestmentEth => _investmentEth; private decimal _investmentEth; // 替换为你实际的EthPrice取值逻辑 public decimal EthPrice { get; set; } }
原有的Fluent API配置可以保留不变,EF会直接读写_investmentEth字段实现持久化。
场景2:不需要将InvestmentEth持久化,仅作为运行时计算属性
不需要存储到数据库的话,直接让EF忽略该属性,简化属性实现即可:
public class InvestorsLottery : Lottery { [Column(TypeName = "decimal(14, 2)")] public decimal Investment { get; set; } [Required] public int Percentage { get; set; } // 直接实现为实时计算属性 [NotMapped] public decimal InvestmentEth => Investment / EthPrice; // 替换为你实际的EthPrice取值逻辑 public decimal EthPrice { get; set; } }
同时删除原有Fluent API中InvestmentEth的相关配置,或者增加忽略配置:
builder.Entity<InvestorsLottery>().Ignore(p => p.InvestmentEth);
如果你的EthPrice是动态变化的,选这个方案更合理,避免数据库存储的旧值和最新汇率不一致。
内容的提问来源于stack exchange,提问作者Noah Bergh
相关产品推荐
相关产品推荐

