NHibernate две колонки как составной ключ И внешние ключи одновременно - PullRequest
3 голосов
/ 03 ноября 2011

Прежде всего, я тщательно провел поиск в Интернете и здесь, не найдя четкого решения поставленной задачи. Приношу свои извинения, если мой поиск не был достаточно точным, и этот ответ уже был опубликован.

Вопрос: у меня есть стол. Эта таблица должна иметь первичный ключ для двух полей и других полей, содержащих некоторые данные. Два поля, которые являются первичными ключами, также должны быть внешними ключами, каждое из которых находится в отдельной таблице. Что-то вроде (псевдокод вперед):

Product: Id (pk)
Category: Id (pk)

ProductCategory: (ProductId (fk on product), CategoryId (fk on category))(pk), SomeOtherField1, SomeOtherField2, etc

Теперь я не могу найти, как настроить это с помощью Fluent Nhibernate. Хотя эта задача тривиальна для EF Code First, в этом проекте я застрял в сети 3.5 и не могу ее использовать, поэтому NHibernate был единственным другим выбором.

Я пытался использовать CompositeId (), References () и другие вещи, пробовал различные комбинации, но ни одна не работала. Я не думаю, что ошибки, которые я получил, актуальны, мне просто нужен пример рабочей конфигурации для такого сценария.

Кто-нибудь знает, как сопоставить это с помощью Fluent Nhibernate (без конфигурации XML)?

1 Ответ

5 голосов
/ 03 ноября 2011

Если у вас есть Product и Category сущности в вашей ProductCategory сущности, тогда ваше отображение должно выглядеть примерно так (ключ здесь KeyReference, а не KeyProperty):

CompositeId()
    .KeyReference(x => x.Product, "ProductId")
    .KeyReference(x => x.Category, "CategoryId");

Map(x => x.SomeOtherField1);

Если у вас есть только идентификаторы в вашем ProductCategory, это будет выглядеть примерно так:

CompositeId()
    .KeyProperty(x => x.ProductId, "ProductId")
    .KeyProperty(x => x.CategoryId, "CategoryId");

Map(x => x.SomeOtherField1);

KeyReferences в первом примере кода указывает на отношения внешнего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...