Как расширить класс сущностей, когда требуется дополнительный вызов базы данных - PullRequest
0 голосов
/ 31 октября 2018

Скажем, у меня есть класс Customer, сгенерированный из моей БД. У этого клиента может быть несколько объектов Order, которым, в свою очередь, может быть присвоено несколько платежей и / или отмен.

Примечание. Все это является частью коммерческого программного обеспечения для бухгалтерского учета, и я не могу вносить изменения в существующие таблицы, хранимые процедуры и т. Д.

В базе данных есть функция, которая принимает идентификатор клиента и выплачивает сумму, причитающуюся за этого клиента, и эта функция - единственный способ точно получить это значение.

Поскольку я использую этот объект Customer так часто и почти всегда нуждаюсь в причитающейся сумме, я бы хотел расширить объект и добавить причитающуюся сумму как свойство (чтобы я мог связываться непосредственно с ним).

Одна проблема заключается в том, что мой объект Customer (насколько я знаю) фактически не знает о контексте базы данных, что означает, что мне нужно создать другой контекст для вызова моей хранимой процедуры, даже если она уже существует.

Чтобы справиться с этим, я расширил класс Entity, добавив в него статическое поле DbConnection с именем Connection, которое заполняется всякий раз, когда создается экземпляр класса.

Итак, прямо сейчас мой код выглядит примерно так ...

public partial class Customer
{
    private double? amountDue;
    public double AmountDue
    {
        if (amountDue.HasValue == false)
        {
            if (Entities.Connection != null && string.IsNullOrEmpty(Entities.Connection.ConnectionString) == false)
            {
                using (var context = new Entities(Entities.Connection))
                {
                    amountDue = context.CalculateOutstanding(this.CustomerID);
                }
            }
        }

        return amountDue.HasValue ? amountDue.Value : 0;
    }
}

Это работает, но есть ли лучший / более умный / более эффективный способ сделать это? Я знаю, что выполнение вызова базы данных в методе получения свойств неодобрительно, но нет способа получить это значение, не возвращаясь к БД. Функция фактически вызывает серверную часть dll, которая вычисляет значение с учетом местоположения, налога, просроченных платежей, лунного цикла, и бог знает, что еще.

Или, есть ли хороший / умный способ сделать это вообще?

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