и заранее спасибо за ваше время.
Мы используем CSLA 3.5.1, хотя, в конечном счете, эта проблема может не иметь большого отношения к CSLA.
Моя компания ушладолгий путь к распространенной ошибке моделирования и, наконец, приходится сталкиваться с ней.Я упростил доменные объекты ниже, чтобы прояснить проблему:
У нас есть 3 класса, определенных следующим образом:
класс Person: BusinessBase
класс Student: Person
Учитель класса: Person
Мы используем NHibernate для нашего ORM, а классы Student и Teacher объединены в подклассы Person в наших отображениях (у нас есть таблицы Person, Student и Teacher) с использованием PersonIDкак производный ключ.
Проблема, как вы, возможно, ожидали, заключается в том, что теперь у нас есть ситуация, когда студент также может быть учителем.В соответствии с текущими объектами и моделями данных это вызывает нарушение первичного ключа, когда мы пытаемся добавить ученика, который уже является учителем, или наоборот.
Вопрос первый: Есть ли какая-либо магия CSLA, которую я могу выполнить набизнес-объект перед сохранением новой записи, чтобы предотвратить эту ситуацию?
Если нет ...
При исследовании этой проблемы я видел два предложения по ее решению: во-первых, в пользу композициипо наследству.Насколько я понимаю, это означает, что каждый ученик и учитель будут содержать свойство Person.
Вопрос второй: для того, чтобы это сработало, правильно ли предположить, что для таблиц ученика и учителя потребуется внешний ключ вПерсональный стол?Я полагаю, что у меня нет полного понимания этого решения, и мне хотелось бы получить какое-то руководство.
Второе решение заключается в том, чтобы рассматривать ученика и учителя как роли, которые играет данный человек.Из того, что я видел, классу Person понадобится коллекция ролей, а таблица связей (PersonRoles?) Используется для сопоставления записей в таблицах ученика и учителя с персоной.
Вопрос (ы) Три: Как выглядят базовый класс Role и таблица PersonRoles?Я полагаю, что подклассы ученика и учителя будут просто содержать их соответствующие свойства.Это правильно?
Есть мнения по поводу решения?Если кто-нибудь сможет найти в Интернете конкретный пример, я бы хотел его увидеть.
Спасибо,
Будет.