2012-01-23 44 views
2

這裏是我的問題:小學和組合鍵與功能NHibernate

域名:我有以下實體:[傳感器]可以定位在[位置]。這是一種多對多的關係。我將它分解爲兩個一對多來聚合[位置]上[傳感器]的[位置]。中間實體是[SensorPosition]。

映射爲[SensorPosition]如下:

CompositeId().KeyReference(sp => sp.Sensor).KeyReference(sp => sp.Location); 
     References(sp => sp.Sensor).ForeignKey().Not.Nullable(); 
     References(sp => sp.Location).ForeignKey().Not.Nullable(); 
     Component(sp => sp.Position, p => 
             { 
              p.Map(pos => pos.X); 
              p.Map(pos => pos.Y); 
              p.Map(pos => pos.Z); 
             }); 

我使用CompositeId()在一個[位置]執行僅一個[傳感器]的約束。 (相同的[傳感器]可以在不同的[位置],這是一個業務邏輯扭曲)

我的問題是:我可以添加一個生成的主鍵(Id)到這?我試過了,但在映射中沒有生成CompositeId()。或者有沒有其他的方式來強制執行這個約束流利地

回答

1

我會避免使用複合主鍵。唯一性可以通過這個映射來實施:

References(sp => sp.Sensor).UniqueKey("KeyName"); 
References(sp => sp.Location).UniqueKey("KeyName"); 

欲瞭解更多詳細信息,請參閱本question

+0

謝謝,這使我的測試通過。 – Cortlendt

1

要生成複合主鍵ID,您需要在外鍵屬性與組合ID中引用的每個實體之間建立bi-directional relationship。在創建SensorPosition的實例時,將每個References屬性分配給組成鍵的相應實體,NHibernate將使用它們的Id值作爲SensorPosition鍵。

從長遠來看,使用"surrogate"密鑰而不是composite key in NHibernate要簡單得多(通常建議)。