使用该表的复合键/外键映射表

时间:2011-12-12 16:49:49

标签: c# nhibernate fluent-nhibernate

我正在尝试映射一个具有复合键的表,并映射另一个引用该表的表。

假设这些表:

  1. ITEMDELIVERY及相关列:
    1. ITEMDELIVERY_ID
    2. DELIVERY_DATE
  2. ITEMDELIVERYDETAIL及相关列:
    1. ITEMDELIVERYDETAIL_ID
    2. ITEMDELIVERY_ID
    3. PARTITIONDATE
  3. 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");
    

    但这不起作用,在会话中调用System.InvalidCastException: Invalid cast from 'DateTime' to 'Double'.时会产生SaveOrUpdate

    更新:

    我刚检查了生成的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)]
    

1 个答案:

答案 0 :(得分:0)

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