将具有复合键/外键的表映射到该表

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

我正在尝试映射一个表,有一个复合键和映射另一个表,引用这个表。

假设这些表:

  1. ITEMDELIVERY对应列:
    1. ITEMDELIVERY_ID
    2. DELIVERY_DATE
  2. ITEMDELIVERYDETAIL相关栏目:
    1. ITEMDELIVERYDETAIL_ID
    2. ITEMDELIVERY_ID
    3. PARTITIONDATE

ITEMDELIVERY.ITEMDELIVERY_IDITEMDELIVERY.DELIVERY_DATE一起构成PK。
ITEMDELIVERYDETAIL.ITEMDELIVERY_IDITEMDELIVERYDETAIL.PARTITIONDATE列构成了ITEMDELIVERYDETAILITEMDELIVERY之间的FK。

我如何映射这个?

我试了如下:

IAutoMappingOverride<ItemDeliveryDetail>:

mapping.References(x => x.ItemDelivery)
       .Columns("ITEMDELIVERY_ID", "PARTITIONDATE");

IAutoMappingOverride<ItemDelivery>:

mapping.CompositeId().KeyProperty(x => x.Id, "ITEMDELIVERY_ID")
                     .KeyProperty(x => x.DeliveryDate, "DELIVERY_DATE");

但是这不起作用,它导致在会话上调用SaveOrUpdate时出现System.InvalidCastException: Invalid cast from 'DateTime' to 'Double'.

更新:

我刚刚检查了生成的SQL,它显示NHibernate以某种方式切换了值:

INSERT INTO ITEMDELIVERYDETAIL
       (ITEMDELIVERYDETAIL_ID,      AMOUNT, PROCESSED_BY_REM, SINGLE_ITEM_PRICE, 
        ITEMDELIVERY_ID, PARTITIONDATE, SupplierInvoice_id)
VALUES (hibernate_sequence.nextval, :p0,    :p1,              :p2,               
        :p3,             :p4,           :p5)
returning ITEMDELIVERYDETAIL_ID into :nhIdOutParam;
:p0 = 20.12.2011 16:29:44 [Type: Double (0)], 
:p1 = 6 [Type: DateTime (0)], 
:p2 = 21.12.2011 16:29:44 [Type: Double (0)], 
:p3 = 7 [Type: Int32 (0)], 
:p4 = 0 [Type: DateTime (0)], 
:p5 = 19.12.2011 16:29:44 [Type: Int32 (0)], 
:nhIdOutParam = 27638398 [Type: Int32 (0)]

你可以看到,参数是一个完全混乱的…
它们应该是这样的:

:p0 = 6 [Type: Double (0)], 
:p1 = 21.12.2011 16:29:44 [Type: DateTime (0)], 
:p2 = 7 [Type: Double (0)], 
:p3 = 0 [Type: Int32 (0)], 
:p4 = 19.12.2011 16:29:44 [Type: DateTime (0)], 
:p5 = 27638398 [Type: Int32 (0)], 
:nhIdOutParam = NULL [Type: Int32 (0)]

将具有复合键/外键的表映射到该表

我解决了这个问题。这种奇怪行为的原因是我有一个显式的属性PartitionDate也被映射(mapping.Map(x => x.PartitionDate).Column("PARTITIONDATE");)。
这基本上意味着PARTITIONDATE列被映射两次。