我想映射一个具有复合键的表并映射引用此表的另一个表。带复合键/外键的映射表
假设这些表:
ITEMDELIVERY
相关栏目:ITEMDELIVERY_ID
DELIVERY_DATE
ITEMDELIVERYDETAIL
相关栏目:ITEMDELIVERYDETAIL_ID
ITEMDELIVERY_ID
PARTITIONDATE
列ITEMDELIVERY.ITEMDELIVERY_ID
和ITEMDELIVERY.DELIVERY_DATE
一起形成的PK。
列ITEMDELIVERYDETAIL.ITEMDELIVERY_ID
和ITEMDELIVERYDETAIL.PARTITIONDATE
形成从ITEMDELIVERYDETAIL
到ITEMDELIVERY
的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)]
看起来像propertytype不匹配。 DeliveryDate在代码和数据库中的类型是什么? – Firo
@Firo:我希望你会关注我的问题:)关于你的评论:这是奇怪的事情:它是代码中的'DateTime',数据库中是'DATE'。但我想知道:NHibernate如何知道,如何映射列?在我的参考资料中,我在'ITEMDELIVERYDETAIL'表中指定了两个列名,但我没有在'ITEMDELIVERY'中指定相应的表...... –
这些列必须具有与CompositeId定义相同的* order *:ITEMDELIVERY_ID - >(column)ItemDelivery.Id | PARTITIONDATE - >(列)ItemDelivery.DeliveryDate。我想知道双人房来自哪里,你有没有其他的房子或房产是双人房?也许映射相同的列名 – Firo