计算EF Code First中的列以进行插入更新和删除

时间:2014-01-26 12:36:29

标签: c# sql entity-framework entity-framework-5

我使用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运行(实际上是从数据库中选择简单的读取日期)?

1 个答案:

答案 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,那么逻辑会稍微复杂一些,但总体思路是一样的。