Я пытаюсь сопоставить новую модель домена с устаревшей базой данных с фиксированной схемой и зациклился на том, как сделать определенный тип сопоставления. Вот дистилляция моей проблемы.NHibernate - лучший способ сопоставления со вторичным ключом
Есть виды рабочих. Например, HourlyWorker и SalariedWorker.
Данные для HourlyWorker хранятся в таблице WORKERS и таблице HOURLY_WORKERS со стандартным отношением внешних ключей между двумя из WORKERS.PK_WORKERS = HOURLY_WORKERS.FK_WORKERS.
«Id» of HourlyWorker с точки зрения NHibernate сопоставляется с WORKERS.PK_WORKERS, что и должно быть.
Пока все хорошо.
Теперь предположим, что есть объект, который применяется только к почасовым работникам.
class Timesheet
HourlyWorker Owner { get; private set; }
В унаследованной базе этого сопоставлено таблице расписаний в довольно простом способе, но с одним уловом: Зарубежный ключом ссылка на владелец выражается не через ссылку на таблицу РАБОТНИКА, а через ссылку на таблицу HOURLY_WORKER. Другими словами, внешний ключ FK_HOURLY_WORKER является уникальным идентификатором, но является не, указывая на значение, которое находится в представлении NHibernate на первичный ключ.
Я не могу просто изменить Id HourlyWorker для отображения таблицы HOURLY_WORKER, потому что 70% базы данных, ссылающейся на часовых работников, использует первичный ключ из WORKER в качестве идентификатора внешнего ключа.
Каковы мои возможности для сопоставления этих отношений?
Что-то, что может сделать это проще: собственность Владельца доступна только для чтения - Расписание не может быть изменено. Тем не менее, когда HourlyWorker удаляется, удаленные должны каскадироваться на все их расписания.
И наконец, пожалуйста, не отвечайте рекомендациями, что я меняю базу данных. Я знаю. Если вам нужен номер телефона моего клиента, чтобы вы могли убедить их, что их схема не самая совершенная вещь, я могу ее предоставить. Я много месяцев борюсь с этим боем. Также не отвечайте, что это указывает на то, что проблема связана с менеджерами, а не только с отображением NHibernate. Я тоже это знаю. На данный момент я просто хочу получить совет о том, как решить техническую проблему.