【问题标题】:How to Map sum property (like TotalPrice) in Entity Framework Code First如何在 Entity Framework Code First 中映射 sum 属性(如 TotalPrice)
【发布时间】:2011-09-18 18:13:31
【问题描述】:

我首先使用实体​​框架 4.1 代码。我有经典示例:Order 和 OrderLines。 每个 OrderLine 都有自己的价格,我想在 Order 上有属性 TotalPrice。

我现在不确定要声明 TotalPrice 属性。我可以使用 linq sum 将其定义为只读,但是当我每次将其添加到结果集中时,它必须从 db 中获取所有订单行以对其价格求和。

我正在考虑解决方案,它将 totalprice 存储到数据库中(用于查询)并仅在订单保存之前重新计算(或者如果订单行更改),但我不知道如何做到这一点。

在 EF 中如何处理这样的场景?

感谢您的建议 彼得

【问题讨论】:

    标签: c#-4.0 mapping entity-framework-4.1 ef-code-first code-first


    【解决方案1】:

    为了简单起见,我建议不要存储计算方法,而只是将计算方法添加到部分类中。我们之前使用*Methods 后缀完成了此操作。例如:

    Order.cs:

    public partial class Order 
    {       
       public ICollection<OrderLine> OrderLines { get;set; }
       //Other EF Properties
    }
    

    OrderLine.cs:

    public partial class OrderLine 
    {       
       public double Price { get;set; }
       //Other EF Properties
    }
    

    OrderMethods.cs

    public partial class Order 
    {
        public double GetTotalPrice() 
        {
            // Total price calculation
        }
    }
    

    【讨论】:

    • 此解决方案不将 TotalPrice 存储在数据库中,因此如果我需要显示它,我必须始终重新计算,这是我想要避免的。
    • 在这种情况下,Order 是您的聚合根,因此您将始终在 Order 的上下文中使用您的 OrderLine 实例集合 - 他们会要么延迟加载,要么加载Order。因此,当您添加另一个 OrderLine 时,总价格的计算变得任意,并且没有真正的理由存储它。
    • 当我显示订单列表(名称、客户和总价)时,我想避免为每个订单加载 OrderLines
    【解决方案2】:

    我存储总价的原因是性能。我已经有合同类,其中包含 Orders (并且也有 TotalPrice 属性)。当我不存储总价,并且想要选择合同列表(例如网格)时,它必须始终读取所有订单及其行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多