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

使用Mediatr+EF Core时,实体默认值属性能否自动赋值?

问题解答

针对你的问题,分不同属性逐一说明EF Core默认值的生效情况:

1. Cost1、Cost2、Cost3

你配置的HasDefaultValue(6.50)属于数据库层面的默认值:

  • 当把Spending实体加入EF上下文并执行SaveChangesAsync时,EF Core会检测到这三个属性是get-only且未被显式赋值(内存中是double类型的CLR默认值0),因此插入SQL语句会省略这些列,数据库自动用6.50填充。
  • 注意:由于属性没有setter,EF Core无法把数据库生成的6.50回写到内存中的实体实例,所以保存后你拿到的convertedSpending.Cost1依然是0,只有数据库里的值是6.50。
  • 若想让内存中的实体实例默认值也为6.50,建议在Spending的构造函数中手动设置:
    public Spending()
    {
        Cost1 = 6.50;
        Cost2 = 6.50;
        Cost3 = 6.50;
    }
    
    这样内存与数据库的值就能保持一致。

2. CurrentSpending

你在Handler中已经显式赋值CurrentSpending = double.Parse(request.CurrentSpending),显式设置的值优先级高于EF Core配置的数据库默认值,因此EF会将你设置的值写入数据库,不会使用配置的0.0默认值。

3. CreatedDateTime

你配置的HasDefaultValueSql("getutcdate()")是数据库层面的默认值:

  • 因为你没有在Handler中手动设置该属性,EF Core会在插入SQL中省略该列,数据库自动执行getutcdate()生成当前UTC时间并填充。
  • 由于这个属性有setter,EF Core会在保存成功后,将数据库生成的时间回写到内存中的CreatedDateTime属性,所以你拿到的实体实例中该属性会是正确的数据库生成时间。

内容的提问来源于stack exchange,提问作者Jimmy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:25:16