我甚至不敢问这个问题,因为我发现整件事情让我非常恶心。但是,您将如何处理遗留数据库。
我有以下三个表
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)
答案 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 id(AlarmCode
,PanelId
)。
如果您需要保留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>