2016-04-13 20 views
0

Ich habe Angst, diese Frage auch wirklich zu stellen, da ich das Ganze ziemlich ekelhaft finde. Aber was werden Sie mit einer Legacy-Datenbank tun?Fließende NHibernate Complex Composite Key Mapping

Ich habe die folgenden drei Tabellen

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

Wenn es aus dem obigen Rendering nicht klar ist, habe ich einen Alarm, die sowohl eine Genset und eine AlarmDescription hat. Das Genset kann direkt über die Eigenschaft GensetId zugeordnet werden. Die AlarmDescription sollte auch leicht von der Id-Eigenschaft abbildbar sein? Aber es wurde nicht so entworfen, und stattdessen ist ein Verbund von (AlarmCode, PanelId) (beachten Sie, sie teilen nicht einmal den gleichen Feldnamen, fand dies heraus, nachdem kämpfen, um eine Beziehung bis zur Überprüfung der Daten zu finden).

Also, wie würden Sie dies mit Fluent NHibernate abbilden? Ich habe ein paar Variationen ausprobiert, bin aber gescheitert. Etwas wie das Folgende wäre ... ideal, aber ich denke nicht, dass so etwas direkt verfügbar ist.

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

Antwort

0

Haben Sie versucht, Formeln? (Sorry, ich bin nicht fließend.)

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

Dies erfordert AlarmDescription Primärschlüssel deklarieren als die composite id (AlarmCode, PanelId).

Wenn Sie AlarmDescription id erhalten müssen, fügen Sie dann in eine natural-id als component:

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

Und es als Schlüssel für Ihre Beziehung in Alarm dank property-ref Referenz:

<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

Formeln sind die Schlussfolgerung, zu der ich auch gekommen bin, ich hatte nur gehofft, dass es eine schönere/magischere Art gab, es zu tun. – shortstuffsushi

+0

Zuerst dachte ich nicht einmal, dass wir eine Möglichkeit haben könnten, das zu kartieren. Ich würde nicht erwarten, eine andere Lösung als die Verwendung von Formel (oder die Änderung der db) für einen solchen Fall zu haben. –