Составной ключ карты с неотображенным столбцом - PullRequest
1 голос
/ 13 декабря 2011

Как мне сопоставить составной ключ, если его часть не сопоставлена ​​в моей сущности?

Пример:

У меня есть таблица 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'


ОБНОВЛЕНИЕ:

Мне кажется, я нашел решение:

  1. Удалите ссылку на ItemDelivery из сопоставленияItemDeliveryDetail: mapping.References(x => x.ItemDelivery);.Columns("ITEMDELIVERY_ID", "PARTITIONDATE");
  2. Измените объявление составного ключа следующим образом:

    mapping.CompositeId().KeyProperty(x => x.Id, "ITEMDELIVERYDETAIL_ID")
                         .KeyReference(x => x.ItemDelivery, "ITEMDELIVERY_ID",
                                                            "PARTITIONDATE");
    

Это имеет побочный эффект сохранения ItemDeliveryDetail не может каскадно сохранить ItemDelivery.Его нужно сохранить заранее.

Однако мне интересно одно:
Будет ли это создавать ПК с тремя столбцами?Если так, как этого избежать и создать PK только для двух необходимых столбцов?

1 Ответ

1 голос
/ 14 декабря 2011

похоже, что у вас есть устаревшая БД, и вы никогда не сгенерируете ее с помощью SchemaExport, поэтому не имеет значения, если NH считает, что у него есть 3 PK-столбца или 1.

после просмотра вашего вопроса Составной ключс последовательностью и если ваш Id уникален, то было бы лучше

mapping.Id(x => x.Id).GeneratedBy.SequenceIdentity("SQ_TRANSFORM_ITEMDEL_IDDID");
mapping.Reference(x => x.ItemDelivery).Columns("ITEMDELIVERY_ID", "PARTITIONDATE");

, даже если в БД PK охватывает оба столбца

Обновление: хитрая вещь в вашем примересчета.Есть хак для того, чтобы второй столбец в соединении (например, куда оптимизатор запросов должен добавить в объединение)

HasManyToMany(u => u.ItemDeliveryDetails)
    .Table("INVOICEITEM_IDD")
    .ChildWhere("PARTITIONDATE = nhGeneratedAliasForINVOICEITEM_IDD.PARTITIONDATE");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...