ef codefirst Сумма дочернего свойства - PullRequest
1 голос
/ 17 июля 2011

У меня есть простая модель 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 ]

3 голосов
/ 17 июля 2011

Я не уверен из вашего описания, но я полагаю, ваша проблема в том, что у новой сущности Baskets == null. Просто попробуйте добавить конструктор по умолчанию:

public Order()
{
    Baskets = new List<Basket>();
}
1 голос
/ 17 июля 2011

А если нет записи типа «Корзина», это вызовет ошибку стоимости;Вы можете использовать этот код:

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

но таким образом, вы должны получить все корзины из БД для расчета суммы !!!Вы можете создать 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;
    }
}

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...