Скажем, у меня есть класс 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, которая вычисляет значение с учетом местоположения, налога, просроченных платежей, лунного цикла, и бог знает, что еще.
Или, есть ли хороший / умный способ сделать это вообще?