Как сопоставить составной ключ, если его часть не сопоставляется с моей сущностью?
Пример:
У меня есть таблица ITEMDELIVERY
, содержащая столбцы:
ITEMDELIVERY_ID
(PK)DELIVERY_DATE
(PK)
У меня есть таблица ITEMDELIVERYDETAIL
, содержащая столбцы:
ITEMDELIVERYDETAIL_ID
(PK)ITEMDELIVERY_ID
(FK)PARTITIONDATE
(PK, FK)
Как видите, в обеих таблицах есть составной ключ, а ITEMDELIVERYDETAIL
имеет «составной» внешний ключ для ITEMDELIVERY
.
В моей модели домена ItemDeliveryDetail
не существует свойства PartitionDate, которое можно было бы сопоставить со столбцом PARTITIONDATE
(см. здесь и здесь по причинам).
Но как теперь сопоставить составной ключ в ITEMDELIVERYDETAIL
?
Я пробовал следующее, но это не работает:
mapping.CompositeId().KeyProperty(x => x.Id, "ITEMDELIVERYDETAIL_ID")
.KeyProperty(x => x.ItemDelivery.DeliveryDate,
"PARTITIONDATE");
Я получаю следующую ошибку:
NHibernate.PropertyNotFoundException: не удалось найти геттер для свойства «DeliveryDate» в классе «REM.Domain.NHibernate.ItemDeliveryDetail»
ОБНОВЛЕНИЕ:
Я думаю, что нашел решение:
- Удалите ссылку на
ItemDelivery
из сопоставленияItemDeliveryDetail
:mapping.References(x => x.ItemDelivery);.Columns("ITEMDELIVERY_ID", "PARTITIONDATE");
Измените объявление составного ключа на это:
mapping.CompositeId().KeyProperty(x => x.Id, "ITEMDELIVERYDETAIL_ID") .KeyReference(x => x.ItemDelivery, "ITEMDELIVERY_ID", "PARTITIONDATE");
Это имеет побочный эффект, заключающийся в том, что сохранение ItemDeliveryDetail
не может каскадно сохранять ItemDelivery
. Его нужно сохранить заранее.
Однако меня интересует один вопрос:
будет ли это создавать ПК с тремя столбцами? Если да, то как этого избежать и создать PK только для двух необходимых столбцов?