如何在 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)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Entity Framework Code First 中删除表?
如何在 Entity Framework Code First 中映射 sum 属性(如 TotalPrice)
如何在 Visual Studio Code 中安装和使用 Entity Framework Core?
如何使用 Entity Framework Code First 让我的数据库播种?