流畅的NHibernate复合组合键映射

时间:2016-04-13 21:07:30

标签: nhibernate fluent-nhibernate nhibernate-mapping

我甚至不敢问这个问题,因为我发现整件事情让我非常恶心。但是,您将如何处理遗留数据库。

我有以下三个表

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

如果从上面的渲染中不清楚,我有一个警报,它有发电机组和警报描述。 Genset可通过GensetId属性直接映射。 AlarmDescription也应该可以轻易地从Id属性中删除吗?但它不是那样设计的,而是映射出(AlarmCode, PanelId)的复合(注意,它们甚至不共享相同的字段名称,在检查数据之前努力寻找任何关系后发现了这一点)

那么,你将如何使用Fluent NHibernate进行映射?我尝试了几种变化,但都失败了。像下面这样的东西是......理想的,但我不认为这样的东西必然是直接可用的。

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

1 个答案:

答案 0 :(得分: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 idAlarmCodePanelId)。

如果您需要保留AlarmDescription个ID,请在其中添加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>
  ...

通过property-ref将其作为Alarm中关系的关键引用:

<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>