2016-04-13 7 views
0

Я боюсь даже задать этот вопрос на самом деле, так как считаю, что все это довольно отвратительно. Но что вы собираетесь делать с устаревшей базой данных.Fluent NHibernate Complex Composite Key Mapping

У меня есть следующие три таблицы

Generator Alarm   AlarmDescription 
--------- -----   ---------------- 
      Id    Id 
Id  <- GensetId  DescriptionText 
      EventTypeId -> AlarmCode 
PanelId ----------------> PanelId 

Если это не видно из приведенного выше рендеринга, у меня есть сигнал тревоги, который имеет как GENSET и AlarmDescription. Genset напрямую преобразуется через свойство GensetId. AlarmDescription также может легко отображаться без права собственности Id? Но он не был разработан таким образом и вместо этого был отображен составной состав (AlarmCode, PanelId) (обратите внимание, что они даже не имеют одинакового имени поля, обнаружили это после попытки найти какое-либо отношение до проверки данных).

Итак, как бы вы нарисовали это с помощью Fluent NHibernate? Я пробовал пару вариантов, но не смог. Что-то вроде следующего было бы ... идеальным, но я не думаю, что что-то подобное обязательно обязательно доступно.

References(x => x.AlarmDescription) 
     .Column("AlarmCode", m => m.EventTypeId) 
     .Column("PanelId", m => m.Genset.PanelId) 

ответ

0

Вы пробовали формулы? (К сожалению, я не использую свободно.)

<many-to-one name="AlarmDescription"> 
    <column name="EventTypeId" /> 
    <formula>(select g.PanelId from Generator g where g.Id = GensetId)</formula> 
</many-to-one> 

Это требует объявить AlarmDescription первичного ключа как в composite id (AlarmCode, PanelId).

Если вам нужно сохранить AlarmDescription идентификатор, а затем добавить в него natural-id в виде component:

<class name="AlarmDescription"> 
    <id name="Id"> 
    <generator .../> 
    </id> 
    <natural-id> 
    <component name="AlarmDescriptionNaturalId"> 
     <property name="AlarmCode" /> 
     <property name="PanelId" /> 
    </component> 
    </natural-id> 
    ... 

и ссылаться на него в качестве ключа для вашего отношения в Alarm благодаря property-ref:

<many-to-one name="AlarmDescription" property-ref="AlarmDescriptionNaturalId"> 
    <column name="EventTypeId" /> 
    <formula>(select g.PanelId from Generator g where g.Id = GensetId)</formula> 
</many-to-one> 
+0

Формулы - это вывод, к которому я пришел, я просто надеялся, что есть более приятный/более волшебный способ сделать это. – shortstuffsushi

+0

Сначала я даже не думал, что у нас может быть способ отобразить это. Я бы не ожидал другого решения, кроме использования формулы (или изменения db) для такого случая. –