EF Core 2.0中如何让实体私有decimal后备字段_orderValue存入数据库?
解决方案:在EF Core 2.0中映射私有后备字段
针对你想要将Order类中的私有_orderValue字段映射到数据库的需求,在EF Core 2.0中有两种简单可靠的实现方式:
方法一:使用Fluent API配置(推荐)
这是EF Core 2.0中处理私有字段映射最直接的方式,你需要在DbContext的OnModelCreating方法里显式配置实体与私有字段的映射关系:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 为Order实体配置私有后备字段_orderValue modelBuilder.Entity<Order>() .Property("_orderValue") // 直接引用私有字段名称 .HasColumnName("OrderValue"); // 可选:指定数据库中的列名,默认会用_orderValue }
这种方式的优势是配置集中在DbContext里,不会污染实体类的代码,EF Core会自动识别并将这个私有字段存储到数据库中,而你的OrderValue属性依然可以正常封装业务逻辑(比如转换为Money类型)。
方法二:使用[BackingField]数据注解
如果你更倾向于在实体类内部标注映射关系,可以使用EF Core 2.0引入的[BackingField]注解,将它标注在公开的OrderValue属性上,指向对应的私有后备字段:
public class Order { private decimal _orderValue; public int Id { get; set; } [BackingField("_orderValue")] public Money OrderValue { get => new Money(_orderValue); set => _orderValue = value.Amount; } }
添加这个注解后,EF Core会自动将_orderValue作为OrderValue属性的后备存储字段,并将其映射到数据库列。
额外注意事项
- 确保
_orderValue不是readonly的,EF需要能够设置这个字段的值(你的代码里已经通过属性的setter赋值,满足要求)。 - 由于
Money类不是实体类型,EF Core不会尝试将它映射到数据库,只会处理_orderValue这个decimal类型的字段,完全符合你的需求。 - 如果不指定列名,EF默认会使用字段名
_orderValue作为数据库列名,你可以通过HasColumnName(Fluent API)或者[Column]注解来修改为更友好的名称。
内容的提问来源于stack exchange,提问作者Mark Johnson
相关产品推荐
相关产品推荐

