用未映射的列映射复合键

本文关键字:映射 复合 | 更新日期: 2023-09-27 18:17:38

我如何映射一个组合键,如果它的一部分没有映射在我的实体?

的例子:

我有一个表ITEMDELIVERY包含以下列:

    ITEMDELIVERY_ID (pk)
  • DELIVERY_DATE (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


更新:

我想我找到解决办法了:

  1. ItemDeliveryDetail的映射中删除对ItemDelivery的引用:mapping.References(x => x.ItemDelivery);.Columns("ITEMDELIVERY_ID", "PARTITIONDATE");
  2. 将组合键的声明更改为:

    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");