2011-12-12 144 views
2

我想映射一個具有複合鍵的表並映射引用此表的另一個表。帶複合鍵/外鍵的映射表

假設這些表:

  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'.

UPDATE:

我只是檢查生成的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)] 
+0

看起來像propertytype不匹配。 DeliveryDate在代碼和數據庫中的類型是什麼? – Firo

+0

@Firo:我希望你會關注我的問題:)關於你的評論:這是奇怪的事情:它是代碼中的'DateTime',數據庫中是'DATE'。但我想知道:NHibernate如何知道,如何映射列?在我的參考資料中,我在'ITEMDELIVERYDETAIL'表中指定了兩個列名,但我沒有在'ITEMDELIVERY'中指定相應的表...... –

+0

這些列必須具有與CompositeId定義相同的* order *:ITEMDELIVERY_ID - >(column)ItemDelivery.Id | PARTITIONDATE - >(列)ItemDelivery.DeliveryDate。我想知道雙人房來自哪裏,你有沒有其他的房子或房產是雙人房?也許映射相同的列名 – Firo

回答

0

我解決了pr oblem。造成這種奇怪行爲的原因是我有一個明確的屬性PartitionDate也被映射(mapping.Map(x => x.PartitionDate).Column("PARTITIONDATE");)。
這基本上意味着PARTITIONDATE列被映射兩次。