Как делать: Картирование (nhibernate) Несколько классов с различной бизнес-логикой из одной и той же таблицы?
-
27-10-2019 - |
Вопрос
В настоящее время я работаю с базой данных Brownfield, которая содержит таблицу, которая содержит данные для 3 различных видов бизнеса. Это связано с продавцами и линиями заказов. В старом приложении мы смогли добавить 3 типа линий заказов в каждый продажи: продукты, почасовые тарифы и текстовые линии. 15 лет назад это было быстрое и грязное решение, чтобы получить простые вопросы в Delphi, чтобы получить все строки в одном документе. Каждый
Теперь я пытаюсь построить объектную модель в C# с помощью nhibernate. Я сделал 3 отдельных объекта без базового класса, из -за того, что эти 3 типа строк не имеют реального бизнес -логического соединения. Тем не менее, я хочу получить эти 3 типа в один список, чтобы заказать их.
Я рассматривал возможность использования наследства, таблицы на класс, так как таблица соответствует требованиям (без столбцов с не-нулевой сдержанностью). Это не логический шаг, поскольку бизнес на тип совершенно другой (только общие общие, - это ID, описание и замечания). Может, компонент? Но как составить карту свойств с 3 разными классами без базового класса или какой -либо ссылки, кроме имени таблицы?
Я надеюсь, что вы, ребята, поняли, что я написал. У меня еще нет реального кода, я просто набросал кое -что на бумаге о том, как справиться с этим кодом.
Кто -нибудь здесь, кто может мне помочь?
С уважением, Тед
Решение
Вы можете поместить интерфейс на три объекта и отобразить его как базовый класс, все в одну и ту же таблицу:
interface IWhatever
{
// central Id for the whole table
int Id { get; set; }
// may be some more properties
}
class Product : IWhatever
{
// ...
}
class HourlyRate : IWhatever
{
// ...
}
class TextLines : IWhatever
{
// ...
}
Картирование:
<class name="IWhatever" table="MyBigTable">
<id .../>
<discriminator column="Type"/>
<subclass name="Product" discriminator-value="P">
<!-- ... -->
</subclass>
<subclass name="HourlyRate" discriminator-value="HR">
<!-- ... -->
</subclass>
<subclass name="TextLines" discriminator-value="TL">
<!-- ... -->
</subclass>
</class>