自定义类型仅保存十进制属性

时间:2018-05-16 12:09:05

标签: c# entity-framework-core

我们正在使用Entity Framework Core 2.0

我希望有一个模型为其中一个字段使用Money类型,并使用十进制类型的支持字段。

目标是将支持字段存储在数据库中。

public class Order
    {
        private decimal _orderValue;

        public int Id { get; set; }

        public Money OrderValue
        {
            get => new Money(_orderValue);
            set => _orderValue = value.Amount;
        }
    }

所以Money类不是实体,而是用作类型。所以我们根本不需要资金进入数据库。但是我们想要存储支持小数。 我如何确保EF创建并存储_orderValue私有字段?

1 个答案:

答案 0 :(得分:2)

  

如何确保EF创建并存储_orderValue私有字段?

您可以通过更好地使用EF Core 2.1(自2018年5月7日开始在Release Candidate 1中)来摆脱支持字段,您可以使用Microsoft解释的值转换功能here

  

值转换器允许在读取时转换属性值   来自或写入数据库。此转换可以来自一个值   到另一个相同类型(例如,加密字符串)或从   一种类型的值到另一种类型的值(例如,   将枚举值转换为数据库中的字符串。)

因此,对于您的情况,您可以删除支持字段。你不再需要它。你的课应该是这样的:

public class Order
{
    public int Id { get; set; }

    public Money OrderValue { get; set; }
}

在您的OnModelCreating方法中,您可以按如下方式配置转换:

modelBuilder.Entity<Order>()
    .Property(p => p.OrderValue)
    .HasConversion(
        v => v.Amount, // <- This is used when storing to the DB
        v => new Money(v) // <- this is used when reading data from your DB
    );

就是这样。实际上它是候选版本,但微软说:

  

EF Core 2.1 RC1是一个“go live”版本,这意味着一旦你测试了它   您的应用程序与RC1正常工作,您可以使用它   制作并获得微软的支持,但你仍然应该   一旦可用,就更新到最终的稳定版本。