【问题标题】:Fluent NHibernate Complex Composite Key MappingFluent NHibernate 复杂复合键映射
【发布时间】:2016-04-13 21:07:30
【问题描述】:

我什至不敢问这个问题,因为我自己觉得整件事都很恶心。但是,您将如何处理遗留数据库。

我有以下三张表

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

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

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

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

【问题讨论】:

    标签: nhibernate fluent-nhibernate nhibernate-mapping


    【解决方案1】:

    你试过公式吗? (对不起,我没有使用fluent。)

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

    【讨论】:

    • 公式也是我得出的结论,我只是希望有更好/更神奇的方法来做到这一点。
    • 起初我什至没有想到我们可能有办法映射它。对于这种情况,除了使用公式(或更改数据库)之外,我不希望有任何其他解决方案。
    猜你喜欢
    • 2013-01-07
    • 2013-04-04
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    相关资源
    最近更新 更多