2011-12-13 68 views
1

如何映射組合鍵,如果其中一部分未映射到我的實體中?帶未映射列的映射組合鍵

實施例:

我有一個表ITEMDELIVERY含有列:

  • ITEMDELIVERY_ID(PK)
  • DELIVERY_DATE(PK)

我具有包含列的表ITEMDELIVERYDETAIL

  • ITEMDELIVERYDETAIL_ID(PK)
  • ITEMDELIVERY_ID(FK)
  • PARTITIONDATE(PK,FK)

正如你可以看到,有兩個表中的複合鍵和ITEMDELIVERYDETAIL有一個 「複合」 外關鍵到ITEMDELIVERY

存在着可能被映射到列PARTITIONDATE我的域模型ItemDeliveryDetail沒有財產PartitionDate(見的原因herehere)。如何在ITEMDELIVERYDETAIL中映射組合鍵?

我嘗試以下,但不工作:

mapping.CompositeId().KeyProperty(x => x.Id, "ITEMDELIVERYDETAIL_ID") 
        .KeyProperty(x => x.ItemDelivery.DeliveryDate, 
             "PARTITIONDATE"); 

我得到以下錯誤:

NHibernate.PropertyNotFoundException: Could not find a getter for property 'DeliveryDate' in class 'REM.Domain.NHibernate.ItemDeliveryDetail'


UPDATE:

我想我找到解決辦法:

  • 更改複合鍵的聲明這樣::

    1. ItemDeliveryDetail映射取出參照ItemDelivery

      mapping.CompositeId().KeyProperty(x => x.Id, "ITEMDELIVERYDETAIL_ID") 
              .KeyReference(x => x.ItemDelivery, "ITEMDELIVERY_ID", 
                       "PARTITIONDATE"); 
      

    這具有節省一個ItemDeliveryDetail副作用可以'級聯保存ItemDelivery。它需要預先保存。

    但是,我想知道一件事:
    這會創建一個三列PK嗎?如果是這樣,如何避免它,只需要爲兩列創建一個PK?

  • 回答

    1

    它看起來像你有一個傳統的數據庫,並將永遠不會生成與SchemaExport,所以它沒關係,如果NH認爲它有3個PK列或1。

    看着你的問題Composite key with sequence,如果你的ID是唯一的獨那麼這將是以後更好地

    mapping.Id(x => x.Id).GeneratedBy.SequenceIdentity("SQ_TRANSFORM_ITEMDEL_IDDID"); 
    mapping.Reference(x => x.ItemDelivery).Columns("ITEMDELIVERY_ID", "PARTITIONDATE"); 
    

    即使在數據庫中的PK跨越兩列

    更新:在棘手的事情你發票的例子。有一個hack有在參加第二列(作爲凡查詢優化器應該添加到加入)

    HasManyToMany(u => u.ItemDeliveryDetails) 
        .Table("INVOICEITEM_IDD") 
        .ChildWhere("PARTITIONDATE = nhGeneratedAliasForINVOICEITEM_IDD.PARTITIONDATE"); 
    
    +0

    您對原有數據庫的假設是正確的。但是,將用於持久性規範測試的測試數據庫應該通過模式導出來創建,以確保一個乾淨可靠的測試環境。 –

    +0

    我有相同的場景,遺傳數據庫和單元測試的映射。但是我不使用SchemaExport,因爲它可能會掩蓋映射錯誤。我將生產數據庫的模式導出到一個sqlscript,我在創建sessionfactory後立即執行。 – Firo

    +0

    好點。儘管如此,還有另一個原因需要我有正確的映射:有一些表具有「ITEMDELIVERYDETAIL」的外鍵。爲了確保生成的連接儘可能快,這個外鍵還需要使用兩列。如果我使用你的答案,這是行不通的,因爲'ITEMDELIVERYDETAIL'被映射爲只有一個ID ... –