Внешний ключ к таблице с 2 столбцами первичного ключа (CompositeId) - PullRequest
2 голосов
/ 11 февраля 2012

Я определил первичный ключ следующим образом:

CompositeId()
    .KeyProperty(x => x.Id)
    .KeyProperty(x => x.Type);

Я пробовал следующее:

References(x => x.EntityWith2ColsPK);

И не удалось выполнить:

Внешний ключ (Fk_MyEntity_EntityWith2ColsPK: MyEntities [Fk_EntityWith2ColsPK])) должен иметь то же количество столбцов, что и ссылочный первичный ключ (EntityWith2ColsPKs [Id, Type]) *

Как можно ссылаться на сущность из EntityWith из EntityWith1013 *


Обновление:

Я пробовал следующее (в соответствии с комментарием AlfeG):

HasMany<EntityWith2ColsPK>(x => x.EntityWith2ColsPK).KeyColumns.Add("Id", "Type").Cascade.All();

Сбой при:

Пользовательский тип не реализует UserCollectionType: EntityWith2ColsPK

Но в любом случае я не хочу отношения 1 ко многим, я хочу отношения 1 к 1.Тем не менее, я не могу заставить ни одну из них работать.

Кроме того, я попробовал:

HasOne<EntityWith2ColsPK>(x => x.EntityWith2ColsPK).PropertyRef(x => x.Id).PropertyRef(x => x.Type);

Что не получается с:

NHibernate.MappingException: свойство не найдено: Введите сущность EntityWith2ColsPK

Что я могу сделать, чтобы это действительно заработало?


Мне удалось чего-то достичь в БД .. но пока,по какой-то причине я подозреваю, что оно дважды отображает свойство «Тип», потому что я хочу, чтобы оно было как частью первичного ключа, так и частью внешнего ключа. Вот что я сделал:

References(x => x.EntityWith2ColsPK).Columns("EntityWith2ColsPKId", "Type").Formula("Id = :EntityWith2ColsPKId AND Type = :Type");

Но я получил следующее исключение:

System.IndexOutOfRangeException: недопустимый индекс 8 для этой SqlParameterCollection с Count = 8.

Поскольку отображение этой сущности такое же, как EntityWith2ColsPK:

CompositeId()
    .KeyProperty(x => x.Id)
    .KeyProperty(x => ((ILocalizedEntity) x).Language);

HELP!

1 Ответ

2 голосов
/ 12 февраля 2012

Вы можете использовать что-то подобное, так как вы все равно не используете каскад на вашем Reference

References(x => x.EntityWith2ColsPK)
    .Columns(new string[] { "ID", "TYPE" })
    .Not.Update()
    .Not.Insert();
...