如何映射组合键,如果其中一部分未映射到我的实体中?带未映射列的映射组合键
实施例:
我有一个表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 ... –