NAngelUK Ответов: 1

Как сообщить приложению, что значение свойства автоматически сгенерированного класса частичных сущностей изменилось


Entity Framework 6, Database First, Linq и все эти вкусности!!!
У меня есть таблица "клиент", одним из полей которой является "DOB"
Используя VS2015 и EF, я успешно сгенерировал модель, которая отлично работает

Я использую linq как
dim customers = context.Customers.toList

а результаты используются в качестве источника данных datagridview в windows forms.

Но, чтобы сделать вещи более интересными, мне нужно отобразить новое вычисляемое поле "возраст" в виде столбца в datagridview, который, конечно же, будет получен из DOB и сегодняшнего дня. Чтобы сделать вещи еще более интересными, я хотел бы упорядочить результаты запроса в порядке возрастания возраста.

Я бы предпочел избежать проекций, которые хотели бы иметь простой класс клиента со всеми необходимыми полями в нем, даже вычисленными. Несмотря на то, что если кому-то хорошо в проекции его код будет приветствоваться так же, как это было трудно для меня, чтобы сделать это таким образом, как функция GetAgeByDates не допускается компилятором и SQL

Что я уже пробовал:

Я создал отдельный файл, который хотел расширить частичный класс Customer, который автоматически генерируется ADO.net модель EF. В этом отдельном файле я создал

Private _AgeOnDate As Integer
   Public ReadOnly Property AgeOnDate As Integer
       Get
           Return _AgeOnDate
       End Get
   End Property

и
public Function GetAgeByDates(dob as Date, optional someDate As Date=Date.Now) As Integer


Мне нужна была эта переменная _AgeOnDate
И вот тут-то и начинается проблема

В идеале я бы хотел сделать что-то вроде
Public Overloads Property DOB As Date
    Get
        Return _DOB
    End Get
    Set(value As Date)
        _DOB = value
        _AgeOnDate = GetAgeFromDates(value, Date.Now)
    End Set
End Property


Таким образом, возраст будет рассчитан после того, как DOB будет установлен, и он будет храниться в _AgeOnDate, таким образом, чтобы быть готовым к использованию в запросе linq, как
dim customers = context.Customers.OrderByDescending(Function(x) x.AgeOnDate).toList


Но это свойство определено в автоматически сгенерированном файле, поэтому я не хотел бы его изменять.
Конечно, кто-то предложил бы упорядочить список по убыванию DOB, но это не проблема. Мне нужно каким-то образом перехватить DOB-сеттера и вычислить возраст, основанный на недавно установленном DOB. Если это возможно, та же тактика будет применена и на некоторых других полях, которые не так легко заказать, как DOB.

Кроме того, я не могу найти такой метод, как
OnDOBChanged
или по крайней мере
OnPropertyChanged
чтобы переопределить и решить проблему. Я с нетерпением жду вашего звонка, ребята. Спасибо за ваше время!

1 Ответов

Рейтинг:
1

phil.o

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

Public ReadOnly Property AgeOnDate As Integer
       Get
           Return GetAgeByDates(_DOB)
       End Get
End Property

Вот хороший источник, касающийся всяких мелочей работы с возрастными вычислениями:
Работа с возрастом: это не то же самое, что промежуток времени![^]