Entity Framework Code First: вычисляемое свойство, к которому можно получить доступ, является собственной таблицей

Можно ли сначала создать вычисляемое свойство в коде EF, которое может использовать другие элементы своей таблицы?

Если нет, каков наилучший способ сделать это без использования метода контекста (я хотел бы, чтобы свойство связывало его с пользовательским интерфейсом wpf без использования конвертеров)?

Этот пример показывает, что я пытаюсь сделать (тихо легко сделать в вычисляемом поле sql):

class MyEntity{

public virtual decimal Amount { get; set; }

public virtual decimal DivideOfThisAmountOnAll
{
    get
      {
        var sum = *******.sum(e=>e.Amount); //How am i supposed to acces to the others?
        return this.Amount / sum;
      }
 }

}

3 ответа

Решение

Вместо непосредственного изменения объекта базы данных я бы порекомендовал создать слой бизнес-логики для привязки. Такие инструменты, как https://github.com/AutoMapper/AutoMapper позволяют легко переносить большинство элементов вашей таблицы без изменений, а затем выполнять такие вещи, как создание итоговых значений, сложных вычисляемых полей и других несохраненных задач с данными.

В MVC это называется Model, View, ViewModel, Controller, где ViewModel - это то, к чему вы привязываетесь, и имеет все вычисленные результаты.

Это вносит дополнительную сложность, но оставляет ваши объекты Model в одиночку (что хорошо) и позволяет вам изолировать ваши правила в одном месте (ViewModel), что позволяет избежать распространения одних и тех же вычислений на множество контроллеров (что является шаблон).

Вы не можете сделать это без доступа к контексту БД. Вы могли бы придумать какую-то схему, где вы вводите ее в сущность и т. Д., Но в основном вы бы запрашивали контекст БД так же, как и любой другой запрос.

class MyEntity{
  public virtual decimal Amount { get; set; }

  public virtual decimal DivideOfThisAmountOnAll(YourDbContext db)
  {  
        var sum = db.LinqQueryHereToAggregateAsYouPlease.Single();
        return this.Amount / sum;
  }

}

Я бы предложил навигационное свойство для этого.

class MyEntity{

    public virtual decimal Amount { get; set; }

    public virtual Parent Parent { get; set; }

    public virtual decimal DivideOfThisAmountOnAll
    {
        get
        {
            var sum = Parent.MyEntities.Sum(e=> e.Amount);
            return this.Amount / sum;
        }
    }

}

Ответ AaronLS тоже хорошо работает, но он вводит зависимость от DbContext (если вы заботитесь о таких вещах).

Другие вопросы по тегам