Как да картографирам съставен ключ, ако част от него не е картографиран в моя обект?
Пример:
Имам таблица 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 само за двете необходими колони?