Пользовательское свойство Entity Framework с использованием внешних параметров - PullRequest
2 голосов
/ 13 января 2012

У меня есть EDM, используемый для возврата коллекции сущностей «Продукт» в рамках проекта DAL.Проект веб-сайта MVC ссылается и непосредственно создает экземпляр ObjectContext и возвращает IQueryable на веб-сайт для подкачки и отображения Продуктов.

Этот объект, для упрощения, скажем, имеет только свойства "ID", "Rate" и "Description".Я хочу создать другое вычисляемое свойство с именем «CostPerMonth», которое будет принимать входные данные с веб-сайта «LoanAmount», и, для простоты, это свойство «CostPerMonth» будет состоять из ((«LoanAmount» * "Оцените ") / 12).

Я не могу помочь, но чувствую, что этот расчет должен быть выполнен в проекте DAL, чтобы сделать код более пригодным для повторного использования, так как везде, где используются эти данные, всегда будет" LoanAmount "указано.Ниже приведены возможные решения, которые у меня были:

  • Создайте частичный класс для Product, добавьте новое свойство "CostPerMonth" в Product.В контроллере веб-сайта, когда возвращаются данные, заполните этот новый столбец, просматривая возвращенные данные и выполняя вычисления?

  • Создать частичный класс для Product, добавить новое свойство "CostPerMonth "к продукту.В проекте DAL создайте вспомогательный класс, у которого есть метод, который принимает параметр «LoanAmount» и возвращает список.Проблема в том, что мне нужно было бы материализовать данные для выполнения расчетов.Метод может принимать параметры «Пропустить» и «Взять», которые можно использовать в запросе Linq, используемом для возврата продуктов?

  • Создайте частичный класс для продукта, добавьте новое свойство «CostPerMonth» в продукт.Добавить еще один уровень к решению, используя веб-сервисы WCF, в методе сервиса выполнять вычисления и использовать REST для возврата данных на веб-сайт MVC?

Любой совет будет очень признателен.

С уважением,

Марка

1 Ответ

1 голос
/ 08 мая 2012

Если мы сделаем шаг назад и фактически разберем то, что вы спрашиваете в своем вопросе, возможно, будет проще объяснить мой ответ.

  • У нас есть объект / сущность с именем Products
  • Существует вычисляемое поле, которое будет (("LoanAmount" * "Rate") / 12)
  • CostPerMonth не требуется хранить в базе данных

Таким образом, это вычисленное поле является бизнес-правилом для сущности продукта. Учитывая, что вы используете MVC, есть только одно место, куда может пойти этот код / ​​логика, и это модель.

Учитывая, что вы используете EF, он будет находиться в не отображенном / вычисляемом поле, и код, который даст вам идею, будет выглядеть примерно так ...

   [NotMapped]
    public decimal CostPerMonth
    {
        get { return (LoanAmount * Rate)/12 ; }
    }

Я могу несколько дней рассказывать о проблемах, связанных с фрагментированной бизнес-логикой на разных уровнях.

Теперь, если вы хотите, чтобы эта логика легко использовалась другими клиентами, вам нужно предоставить для этого сервис. (вы можете использовать webAPI / service stack / wcf и т. д.) Это действительно еще один вопрос, основанный на ваших потребностях. Но дело в том, что ваша логика в одном месте.

...