用未映射的列映射复合键
本文关键字:映射 复合 | 更新日期: 2023-09-27 18:17:38
我如何映射一个组合键,如果它的一部分没有映射在我的实体?
的例子:
我有一个表ITEMDELIVERY
包含以下列:
-
DELIVERY_DATE
(pk)
ITEMDELIVERY_ID
(pk)我有一个表ITEMDELIVERYDETAIL
包含列:
-
ITEMDELIVERYDETAIL_ID
(pk) -
ITEMDELIVERY_ID
(fk) -
PARTITIONDATE
(pk, fk)
可以看到,两个表中都有一个复合键,ITEMDELIVERYDETAIL
有一个指向ITEMDELIVERY
的"复合"外键。
在我的域模型ItemDeliveryDetail
中不存在可以映射到列PARTITIONDATE
的属性PartitionDate(查看这里和这里的原因)。
但是现在,我如何在ITEMDELIVERYDETAIL
中映射复合键?
我尝试了以下操作,但没有成功:
mapping.CompositeId().KeyProperty(x => x.Id, "ITEMDELIVERYDETAIL_ID")
.KeyProperty(x => x.ItemDelivery.DeliveryDate,
"PARTITIONDATE");
我得到以下错误:
NHibernate。在类'REM.Domain.NHibernate.ItemDeliveryDetail'中找不到属性'DeliveryDate'的getter
更新:
我想我找到解决办法了:
- 从
ItemDeliveryDetail
的映射中删除对ItemDelivery
的引用:mapping.References(x => x.ItemDelivery);.Columns("ITEMDELIVERY_ID", "PARTITIONDATE");
将组合键的声明更改为:
mapping.CompositeId().KeyProperty(x => x.Id, "ITEMDELIVERYDETAIL_ID") .KeyReference(x => x.ItemDelivery, "ITEMDELIVERY_ID", "PARTITIONDATE");
这有一个副作用,保存ItemDeliveryDetail
不能级联保存ItemDelivery
。它需要预先保存。
然而,我想知道一件事:
这将创建一个三列的PK吗?如果是这样,如何避免它,并且只为所需的两个列创建一个PK ?
看起来你有一个遗留的数据库,永远不会用SchemaExport生成它,所以NH认为它有3个PK列还是1个都没关系。
查看您的问题组合键与序列后,如果您的Id是唯一的,那么最好是
mapping.Id(x => x.Id).GeneratedBy.SequenceIdentity("SQ_TRANSFORM_ITEMDEL_IDDID");
mapping.Reference(x => x.ItemDelivery).Columns("ITEMDELIVERY_ID", "PARTITIONDATE");
即使在数据库中,PK跨越两个列
更新:在您的发票示例中棘手的事情。有一种方法可以在连接中包含第二列(作为查询优化器应该添加到连接中的列)
HasManyToMany(u => u.ItemDeliveryDetails)
.Table("INVOICEITEM_IDD")
.ChildWhere("PARTITIONDATE = nhGeneratedAliasForINVOICEITEM_IDD.PARTITIONDATE");