如何映射組合鍵,如果其中一部分未映射到我的實體中?帶未映射列的映射組合鍵
實施例:
我有一個表ITEMDELIVERY
含有列:
ITEMDELIVERY_ID
(PK)DELIVERY_DATE
(PK)
我具有包含列的表ITEMDELIVERYDETAIL
:
ITEMDELIVERYDETAIL_ID
(PK)ITEMDELIVERY_ID
(FK)PARTITIONDATE
(PK,FK)
正如你可以看到,有兩個表中的複合鍵和ITEMDELIVERYDETAIL
有一個 「複合」 外關鍵到ITEMDELIVERY
。
存在着可能被映射到列PARTITIONDATE
我的域模型ItemDeliveryDetail
沒有財產PartitionDate(見的原因here和here)。如何在ITEMDELIVERYDETAIL
中映射組合鍵?
我嘗試以下,但不工作:
mapping.CompositeId().KeyProperty(x => x.Id, "ITEMDELIVERYDETAIL_ID")
.KeyProperty(x => x.ItemDelivery.DeliveryDate,
"PARTITIONDATE");
我得到以下錯誤:
NHibernate.PropertyNotFoundException: Could not find a getter for property 'DeliveryDate' in class 'REM.Domain.NHibernate.ItemDeliveryDetail'
UPDATE:
我想我找到解決辦法:
更改複合鍵的聲明這樣::
- 從
ItemDeliveryDetail
映射取出參照ItemDelivery
mapping.CompositeId().KeyProperty(x => x.Id, "ITEMDELIVERYDETAIL_ID") .KeyReference(x => x.ItemDelivery, "ITEMDELIVERY_ID", "PARTITIONDATE");
這具有節省一個ItemDeliveryDetail
副作用可以'級聯保存ItemDelivery
。它需要預先保存。
但是,我想知道一件事:
這會創建一個三列PK嗎?如果是這樣,如何避免它,只需要爲兩列創建一個PK?
您對原有數據庫的假設是正確的。但是,將用於持久性規範測試的測試數據庫應該通過模式導出來創建,以確保一個乾淨可靠的測試環境。 –
我有相同的場景,遺傳數據庫和單元測試的映射。但是我不使用SchemaExport,因爲它可能會掩蓋映射錯誤。我將生產數據庫的模式導出到一個sqlscript,我在創建sessionfactory後立即執行。 – Firo
好點。儘管如此,還有另一個原因需要我有正確的映射:有一些表具有「ITEMDELIVERYDETAIL」的外鍵。爲了確保生成的連接儘可能快,這個外鍵還需要使用兩列。如果我使用你的答案,這是行不通的,因爲'ITEMDELIVERYDETAIL'被映射爲只有一個ID ... –