【问题标题】:MCV6 EF Changing the sign of a decimal based on transaction typeMCV6 EF 根据交易类型更改小数的符号
【发布时间】:2020-10-13 11:56:27
【问题描述】:

我首先使用 EF 代码和 MVC6 将事务存储在 SQL 数据库中,我需要根据事务类型反转值的符号。我想在一个中心点执行此操作,因此我不必在整个应用程序中进行多项更改。即在模型创建或实体上。比如:

    public class Transactions : EntityBase
    {
        public TransactionType Type { get; set; }

        public decimal Amount
        {
            get
            {
                if (Type == Type.Refund && Amount > 0)
                    return Amount * -1;
                else
                    return Amount;
            }
            set { Amount = value; }
        }
    }

我们也可以将值存储为负数。关于如何最好地实现这一点的任何建议?

【问题讨论】:

  • 当然你可以找到一种方法来做到这一点,但我会正确存储它。这依赖于 EF 正在处理的数据来反映交易的负值。如果您使用原始 SQL 或任何其他数据访问层生成报告,如果没有类似的处理,您的余额将会出错。
  • 这很公平,我们需要将值存储为负数或持有 ValueType + 或 - 以使用 Transaction Type。始终需要逻辑来显示正确的总数,因为用户可以为所有交易类型发布负值,即-50 英镑的贷方票据 + 100 英镑的贷方票据 + 100 英镑的发票 = 50 英镑。干杯。

标签: c# entity-framework model-view-controller transactions


【解决方案1】:

您可以继续创建一个未映射的属性和一个由 EF 填充的属性。

    public class Transactions : EntityBase
    {
        public TransactionType Type { get; set; }
        public RawAmount { get; set; }

        [NotMapped]
        public decimal Amount
        {
            get
            {
                if (Type == Type.Refund && RawAmount > 0)
                    return RawAmount * -1;
                else
                    return RawAmount;
            }
            set 
            { 
                Type = value > 0 ? Type.Expense : Type.Refund;
                Amount = Math.Abs(value); 
            }
        }
    }

如果您在 EF 中使用流畅的配置,您甚至可以将 RawAmount 属性设置为受保护,因此不会被误用。

【讨论】:

  • 这很好,我们可以使用带有 [NotMapped] 注释的protected,谢谢。
  • 有没有办法创建一个表达式,这些属性将在 LINQ to Entity 查询中起作用?我们在使用 Amount 转换为 SQL 查询时遇到错误。如果在内存中调用查询后请求未映射的属性,它会起作用。
  • @James 未映射的属性与任何普通属性一样工作,因为它不是由 EF 直接处理的。要使其与 IQueryable 一起使用,您必须查询映射的字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2013-07-27
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多