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 (если вы заботитесь о таких вещах).