Как мне сопоставить составной ключ, если его часть не сопоставлена в моей сущности?
Пример:
У меня есть таблица 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 только для двух необходимых столбцов?