ef code first子表属性的总和

时间:2011-07-17 12:17:08

标签: entity-framework asp.net-mvc-3 ef-code-first

我有一个简单的EF CodeFirst模型,我在MVC3项目中使用,我有Order和Basket的脚手架控制器。

    public class Order
    {

    public int OrderID { get; set; }

    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    [DisplayName("When")]
    public DateTime DateOccurred { get; set; }

    public virtual ICollection<Basket> Baskets { get; set; }

    public decimal Total
    {
        get
        {
            return Baskets.Sum(b => b.Price);
        }
    }
}

public class Basket
{
    public int BasketID { get; set; }
    public int OrderID { get; set; }
    public decimal  Price  { get; set; }
    public virtual Order Order { get; set; }
}

我想将Total用作Order类中的属性。

通过此实现,只要创建没有购物篮的订单,ef就会抛出错误。

我是以完全错误的方式解决这个问题,还是我忽略了一个简单的调整?

2 个答案:

答案 0 :(得分:3)

我不确定你的描述,但我猜你的问题是新实体有Baskets == null。只是尝试添加默认构造函数:

public Order()
{
    Baskets = new List<Basket>();
}

答案 1 :(得分:1)

如果没有任何类型“篮子”的记录,那将导致成本错误;你可以使用这段代码:

public class Order{

    public int OrderID { get; set; }

    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    [DisplayName("When")]
    public DateTime DateOccurred { get; set; }

    public virtual ICollection<Basket> Baskets { get; set; }

    private decimal? _total;
    public decimal Total{
        get{
            if(_total.HasValue)
                return _total.Value;
            if(this.Baskets == null){
                // retrive Baskets from db, for example:
                this.Baskets = MyRepository.GetBasketsFor(this.OrderId);
            }
            _total = (Baskets.Sum(b => (decimal?) b.Price)) ?? 0;
            return _total.Value;
        }
    }
}

但是这样,你必须从db获取所有Baskets来计算总和!你可以创建一个Repository方法来做到这一点;例如:

private decimal? _total;
public decimal Total{
    get{
        if(!_total.HasValue)
            _total = (MyRepository.GetBasketsTotalFor(this.OrderId)) ?? 0;
        return _total.Value;
    }
}

public class MyRepository{
    static public decimal? GetBasketsTotalFor(int orderId){
        var total = context.Baskets
                               .Where(b => b.OrderId == orderId)
                               .Sum(b => (decimal?) b.Price);
        return total;
    }
}
祝你好运。