我正在尝试映射一个具有复合键的表并映射另一个引用该表的表。
假设这些表:
-
ITEMDELIVERY
与相关专栏:-
ITEMDELIVERY_ID
-
DELIVERY_DATE
-
-
ITEMDELIVERYDETAIL
与相关专栏:-
ITEMDELIVERYDETAIL_ID
-
ITEMDELIVERY_ID
-
PARTITIONDATE
-
列 ITEMDELIVERY.ITEMDELIVERY_ID
和 ITEMDELIVERY.DELIVERY_DATE
一起组成PK。
列 ITEMDELIVERYDETAIL.ITEMDELIVERY_ID
和 ITEMDELIVERYDETAIL.PARTITIONDATE
从 ITEMDELIVERYDETAIL
形成 FK至 ITEMDELIVERY
.
我如何映射它?
我尝试了以下方法:
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
在 session 上。
更新:
我刚刚检查了生成的 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)]
最佳答案
我解决了这个问题。这种奇怪行为的原因是我有一个显式属性 PartitionDate
也被映射 (mapping.Map(x => x.PartitionDate).Column("PARTITIONDATE");
).
这基本上意味着 PARTITIONDATE
列被映射了两次。
关于c# - 将具有复合键/外键的表映射到该表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8477759/