2016-04-13 56 views
0

Bu soruyu gerçekten sormaktan korkuyorum, çünkü her şeyi kendime oldukça iğrenç buluyorum. Ancak, eski bir veritabanı ile ne yapacaksınız. Yukarıdaki render açıkça değilseFluent NHibernate Kompleks Kompozit Anahtar Eşleştirmesi

aşağıdaki üç tablo

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

var, bir jeneratör ve bir AlarmDescription hem sahip bir Alarm var. Jeneratör, GensetId özelliği ile doğrudan eşlenebilir. AlarmDescription ayrıca Id özelliği doğru kolayca eşlenebilir olmalıdır? Ancak bu şekilde tasarlanmamıştı ve bunun yerine (AlarmCode, PanelId) bir kompozit ile eşleştirilmiştir (not, aynı alan adını bile paylaşmazlar, verileri inceledikten sonra herhangi bir ilişki bulmak için uğraştıktan sonra bunu bulmuşlardır).

Peki, bunu Fluent NHibernate kullanarak nasıl eşlersiniz? Birkaç varyasyon denedim, ama başarısız oldum. Aşağıdaki gibi bir şey ideal olurdu ... ... ama sanırım böyle bir şey mutlaka direkt olarak kullanılabilir.

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

cevap

0

Formüller denediniz mi? (Maalesef, akıcı kullanarak değil.)

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

Bu composite id (AlarmCode, PanelId) olarak AlarmDescription birincil anahtar ilan gerektirir.

Eğer AlarmDescription kimliği korumak gerekiyorsa, o zaman bir natural-idcomponent bir şekilde ekleyin:

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

Ve property-ref için Alarm sayesinde sizin ilişkisi için anahtar olarak başvurmak:

<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

Formüller de geldiğim sonuçtur, sadece bunu yapmak için daha güzel/daha büyülü bir yol olduğunu umuyordum. – shortstuffsushi

+0

İlk başta, bunu haritalamanın bir yolu olabileceğini düşünmüyordum bile. Böyle bir durum için formül (veya db'yi değiştirmekten) kullanmaktan başka bir çözüm beklemem. –