我有一个简单的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就会抛出错误。
我是以完全错误的方式解决这个问题,还是我忽略了一个简单的调整?
答案 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;
}
}
祝你好运。