C# 持久化货币和货币值对象

C# 持久化货币和货币值对象,c#,sql-server,entity-framework-core,currency,value-objects,C#,Sql Server,Entity Framework Core,Currency,Value Objects,在将Money value对象(支付对象的属性)持久化到数据库时,我正在处理一个数据冗余难题:默认情况下,Entity Framework Core将在支付表中为Money创建3列(Money\u value、Money\u Currency\u Symbol、Money\u Currency\u Name) 为了解决这个问题,我有以下想法: 创建一个货币表并为其添加数据种子,而货币保留所有值对象功能-这将在支付方法中节省2列(货币名称和货币符号),但添加一个额外的列-货币外键。这可能违反Val

在将Money value对象(支付对象的属性)持久化到数据库时,我正在处理一个数据冗余难题:默认情况下,Entity Framework Core将在支付表中为Money创建3列(Money\u value、Money\u Currency\u Symbol、Money\u Currency\u Name)

为了解决这个问题,我有以下想法:

  • 创建一个货币表并为其添加数据种子,而货币保留所有值对象功能-这将在支付方法中节省2列(货币名称和货币符号),但添加一个额外的列-货币外键。这可能违反ValueObject实现实践,每次向系统添加新货币时,都必须将其作为静态字段添加到数据种子和货币类中,以保持完整性。此外,添加表联接将降低查询性能
  • 将Money属性作为JSON字符串值持久保存在Payment表中,同时在Payment类定义中保留“Money”类型的对象属性-我仍然需要检查如何安全地实现这一点
  • 映射表配置时忽略Currency Name属性(仅持久化货币值和货币符号)。这里的问题是,当从数据库检索时,Money属性中的货币名称将为null,这可能导致不一致
  • 将货币中的货币属性类型从“货币”更改为字符串(仅将货币符号保存为唯一标识符)。这样,在需要在应用程序中显示货币名称的任何地方,都可以从货币静态字段中检索该名称,并将其显示在Dto中
  • 我将非常感谢您根据个人经验提出的任何建议,谢谢

    public class Currency 
    {
        public static readonly Currency USD = new Currency("$", "USD");
    
        protected Currency(string symbol, string name)
        {
           Symbol = symbol;
           Name = name;
        }
    
        public string Symbol { get; private set; }
        public string Name { get; private set; }
    }
    
    public class Money 
    {
        public Currency Currency { get; private set; }
        public decimal Value { get; private set; }
    }
    
    public class Payment
    {
        // other properties
        public Money Money{ get; private set; }
    }
    
    
    替代货币定义(货币为字符串)

    public class Money 
    {
         public string CurrencySymbol { get; private set; }
         public decimal Value { get; private set; }
    }