Первичные И составные ключи в одном объекте с Fluent Nhibernate - PullRequest
2 голосов
/ 23 января 2012

Вот моя проблема:

Домен: у меня есть следующие объекты: [Датчик], которые могут быть расположены в [Местоположение].Это отношения многие ко многим.Я разбил его на два, один-ко-многим, чтобы собрать [Положение] [Сенсора] в [Местоположение].Промежуточным объектом является [SensorPosition].

Отображение для [SensorPosition] выглядит следующим образом:

 CompositeId().KeyReference(sp => sp.Sensor).KeyReference(sp => sp.Location);
        References(sp => sp.Sensor).ForeignKey().Not.Nullable();
        References(sp => sp.Location).ForeignKey().Not.Nullable();
        Component(sp => sp.Position, p =>
                                         {
                                             p.Map(pos => pos.X);
                                             p.Map(pos => pos.Y);
                                             p.Map(pos => pos.Z);
                                         });

Я использую CompositeId () для принудительного ограничения только одного [Sensor] в одном[Место нахождения].(Один и тот же [датчик] может находиться в разных [местоположениях], это поворот бизнес-логики)

Мой вопрос: могу ли я добавить к этому сгенерированный первичный ключ (Id)?Я пробовал это, но с CompositeId () в отображении он не генерируется.Или есть какой-то другой способ принудительно применить это ограничение ?

Ответы [ 2 ]

1 голос
/ 23 января 2012

Для создания составных идентификаторов первичного ключа необходимо установить двунаправленное отношение между свойствами внешнего ключа и каждым объектом, указанным в составном идентификаторе.Когда вы создаете экземпляр SensorPosition, присвойте каждое свойство References соответствующим сущностям, которые составляют ключ, и NHibernate будет использовать их значения Id для ключа SensorPosition.

В долгосрочной перспективе это намного проще (и обычнорекомендуется) использовать «суррогатный» ключ вместо составного ключа в NHibernate .

1 голос
/ 23 января 2012

Я бы не использовал составные первичные ключи.Уникальность может быть обеспечена этим отображением:

References(sp => sp.Sensor).UniqueKey("KeyName");
References(sp => sp.Location).UniqueKey("KeyName");

Подробнее см. вопрос .

...