使用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
相关产品推荐
相关产品推荐

