В настоящее время я пишу N-уровневую архитектуру системы ASP.NET с относительно нормализованным внутренним интерфейсом базы данных SQL, но я пытаюсь понять, как следует искать значения в моих бизнес-объектах (я не получить привилегию использования EF или ORM). Моя таблица (в качестве примера) может быть структурирована так:
CoreDataTable:
ID | Name | Favourite_Colour
---|-------|-----------------
01 | Peter | 01
02 | John | 03
03 | Mary | 05
ColoursLookup:
ID | Colour | is_active
---|--------|----------
01 | Red | 1
02 | Green | 1
03 | Blue | 1
04 | Pink | 1
05 | Black | 1
Теперь изначально я создал свой бизнес-объект, который будет выглядеть следующим образом:
public class Person
{
protected int PersonID { get; set; }
public string Name { get; set; }
public int FavouriteColour { get; set; }
}
Но что мне делать, когда, например, я хочу перечислить всех людей в базе данных вместе с их любимым цветом? Я не могу показать только идентификатор поиска, поэтому в минуту я вижу 4 варианта:
- Добавить метод к классу с именем
Person.GetColourStringValue
, который получает имя цвета из базы данных при вызове. Это было бы неэффективно, поскольку использование этого метода на 100 объектах «Person» привело бы к 100 запросам к базе данных.
- Имейте свойство
FavouriteColour
объекта Person
в виде строки и выполняйте обратный поиск всякий раз, когда записываете объект person в базу данных (то есть берете имя цвета и получаете соответствующий идентификатор). Это опасно для ИМО в маловероятном случае, когда два цвета имеют одно и то же имя в базе данных.
- Сохраните идентификатор и значение в объекте
Person
и синхронизируйте их всякий раз, когда обновляется одно или другое значение. Это кажется слишком сложным для относительно тривиальной задачи.
- Создайте два представления: объект
Person
и объект PersonSummary
, который возвращает версию объекта только для чтения со всеми значениями поиска, преобразованными в их описательные имена.
Я на 100% убежден, что я (а) переосмысливаю это и (б) усложняю, чем нужно. Итак, есть ли предпочтительный способ сделать это? Или есть вариант, который я упустил? Любая помощь приветствуется, я занимаюсь этим часами, не принимая решения.
Спасибо.