2011-12-13 84 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 ... –