【问题标题】:ef codefirst Sum of childtable propertyef code first 子表属性的总和
【发布时间】:2011-07-17 12:17:08
【问题描述】:

我有一个在 MVC3 项目中使用的简单 EF CodeFirst 模型,我为 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 就会抛出一个错误。

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

【问题讨论】:

  • 忘了说错误是"{"Value cannot be null.\r\nParameter name: source"}"。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果没有任何“篮子”类型的记录,则会引发成本错误;您可以使用此代码:

    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来计算sum!!!您可以创建一个存储库方法来执行此操作;例如:

    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;
        }
    }
    

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 2013-10-21
      相关资源
      最近更新 更多