You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core中如何使用backingfield存储数据,解决InvestmentEth值为0的问题

问题核心原因

  1. 你配置了UsePropertyAccessMode.Field,EF Core读写InvestmentEth属性时会直接操作私有字段_investmentEth,完全不走属性的get/set方法,你写在set里的计算逻辑永远不会被触发。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:18:02