2015-04-01 103 views
0

因此,我已以下實體:功能NHibernate子類參考

TimelineRecord: 
    ID: PK 
    From: DateTime 
    To: DateTime 

ServiceRecord extends TimelineRecord: 
    ID: PK 
    TimelineRecord_ID: FK 
    SomeSpecificProperties... 

Demand: 
    ID: PK 
    From: DateTime 
    To: DateTime 
    ... 

ServiceDemandConnection: 
    ID: PK 
    Service: ServiceRecord 
    Demand: Demand 

TimelineRecord,需求和ServiceDemandConnection使用類映射 與標識映射(X => x.Id)。 ServiceRecord使用SubclassMap(table-per-class)進行映射。 ServiceDemandConnection中的引用使用引用(x => x.Service).Cascade.None()映射,對於.Demand也是如此。

問題是插入ServiceDemandConnection並正確設置了ServiceRecord和Demand。 我收到一個錯誤:Detail = Key(servicerecord_id)=(8)在表「ServiceRecord」中不存在。什麼錯誤狀態是真實的。 8是TimelineRecord的ID,而不是ServiceRecord。但是,應該使用ServiceRecord的ID(TimelineRecord_ID,實際上未映射/代碼中無法訪問)。當前映射隱藏ServiceRecord.ID。

我該如何告訴NHibernate使用子類表(ServiceRecord)的ID,而不是基類表(TimelineRecord)? NHibernate實際上在數據庫中創建了一個適當的約束,但是在運行時卻以某種方式違反了它。

回答

0

你需要或者

  • 地圖ServiceRecord作爲單獨的類不使用SubclassMap使用它的ID
  • 或使用ID從基類,並沒有映射它裏面SubclassMap

第二方法工作,因爲SubclassMap創建一個FK關係的子對象和父對象,使數據是利並且你有類似的東西

TimeLineRecord 
    ID : PK 

ServiceRecord extends TimelineRecord: 
    TimelineRecord_ID: FK -----> TimeLineRecord.ID 

指向引用子類仍然有效。

+0

我想保留繼承。第二種選擇是可能的,但是我不會在DB中有適當的約束。任何其他想法? – wysek 2015-04-01 14:16:19

+0

是的,你會的。帶有第二個選項的ID只存在於基類中,而子類僅將FK保留爲父類。在兩個級別上保留id是多餘的,這可能會導致問題 – tchrikch 2015-04-01 14:17:27

+0

在此上下文中,_proper constraint_我的意思是對ServiceDemandConnection.Service FK的約束。使用第二種方法,我需要將ServiceDemandConnection.Service的類型從ServiceRecord更改爲TimelineRecord,並檢查其在業務邏輯中的有效性。我錯過了什麼嗎? – wysek 2015-04-01 14:37:16