如何在 Entity Framework Code First 中映射 sum 属性(如 TotalPrice)
Posted
技术标签:
【中文标题】如何在 Entity Framework Code First 中映射 sum 属性(如 TotalPrice)【英文标题】:How to Map sum property (like TotalPrice) in Entity Framework Code First 【发布时间】:2011-09-18 18:13:31 【问题描述】:我首先使用实体框架 4.1 代码。我有经典示例:Order 和 OrderLines。 每个 OrderLine 都有自己的价格,我想在 Order 上有属性 TotalPrice。
我现在不确定要声明 TotalPrice 属性。我可以使用 linq sum 将其定义为只读,但是当我每次将其添加到结果集中时,它必须从 db 中获取所有订单行以对其价格求和。
我正在考虑解决方案,它将 totalprice 存储到数据库中(用于查询)并仅在订单保存之前重新计算(或者如果订单行更改),但我不知道如何做到这一点。
在 EF 中如何处理这样的场景?
感谢您的建议 彼得
【问题讨论】:
【参考方案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 属性)。当我不存储总价,并且想要选择合同列表(例如网格)时,它必须始终读取所有订单及其行。
【讨论】:
以上是关于如何在 Entity Framework Code First 中映射 sum 属性(如 TotalPrice)的主要内容,如果未能解决你的问题,请参考以下文章