2011-07-17 7 views
1

私はMVC3プロジェクトで使用している単純なEF CodeFirstモデルを持っています。私はOrderとBasketのコントローラを足場にしています。ef codefirst子テーブルのプロパティの合計

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

私はOrderクラス内のプロパティとしてTotalを使用したいと思います。

この実装では、注文がバスケットなしで作成されるとすぐにefがエラーをスローします。

私は完全に間違った方法でこれをやっていますか、これは簡単な調整ですが、私は見落としてしまったのですか?

+0

EFはどんなエラーを投げますか? –

+0

エラーは "{"値はnullにはできません。\ r \ nパラメータ名:source "}"。 – Gavin

答えて

1

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

    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からすべてのバスケットをフェッチする必要があります。これを行うリポジトリメソッドを作成することができます。例えば:

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

幸運。

3

私はあなたの説明から分かりませんが、あなたの問題は、新しいエンティティがBaskets == nullであることです。

public Order() 
{ 
    Baskets = new List<Basket>(); 
} 
関連する問題