因此,我已以下實體:功能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實際上在數據庫中創建了一個適當的約束,但是在運行時卻以某種方式違反了它。
我想保留繼承。第二種選擇是可能的,但是我不會在DB中有適當的約束。任何其他想法? – wysek 2015-04-01 14:16:19
是的,你會的。帶有第二個選項的ID只存在於基類中,而子類僅將FK保留爲父類。在兩個級別上保留id是多餘的,這可能會導致問題 – tchrikch 2015-04-01 14:17:27
在此上下文中,_proper constraint_我的意思是對ServiceDemandConnection.Service FK的約束。使用第二種方法,我需要將ServiceDemandConnection.Service的類型從ServiceRecord更改爲TimelineRecord,並檢查其在業務邏輯中的有效性。我錯過了什麼嗎? – wysek 2015-04-01 14:37:16