我使用Entity Framework 5.0 CodeFirst方法
我有两张桌子
public class Order
{
public int Id { get; set; }
public int OrderAmount { get; set; }
public virtual IList<OrderItem> OrderItems { get; set; }
}
public class OrderItem
{
public int Id { get; set; }
public int Amount { get; set; }
public virtual Order Order { get; set; }
}
订单表中的OrderAmount是每个订单项的金额之和 我需要在插入订单时自动计算OrderAmount 或者当我更新订单商品的金额时
我不把我的逻辑推到数据库(我不想使用[DatabaseGenerated(DatabaseGeneratedOption.Computed)]并在数据库中计算这个值)
我也知道可以使用
Public int OrderAmount{get{CalcSumOfOrderAmount()};set{}}
但问题是甚至当我想要在网格中显示订单时CalcSumOfOrderAmount()方法运行并且它会额外加载
有没有办法让CalcSumOfOrderAmount()方法仅在插入更新和删除时运行,而不是为select运行(实际上是从数据库中选择简单的读取日期)?
答案 0 :(得分:0)
您可以使用ObservableCollection<T>
:
public class Order
{
public int Id { get; set; }
public int OrderAmount { get; set; }
public virtual ObservableCollection<OrderItem> OrderItems
{
get
{
if (orderItems == null)
{
orderItems = new ObservableCollection<OrderItem>();
orderItems.CollectionChanged += (s, args) =>
{
OrderAmount = OrderItems.Sum(item => item.Amount);
}
}
return orderItems;
}
}
private readonly ObservableCollection<OrderItem> orderItems;
}
请注意,我已将集合设置为只读属性(这足以实现/保存实体和操作集合数据)。如果由于某种原因仍然需要读/写OrderItems
,那么逻辑会稍微复杂一些,但总体思路是一样的。