2012-02-11 1 views
2

Я определил первичный ключ следующим образом:Внешний ключ к таблице с 2 колонками первичного ключа (CompositeId)

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

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

References(x => x.EntityWith2ColsPK); 

и не с :

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

Как я могу ссылаться на EntityWith2ColsPK с другого объекта?


Update:

Я попытался следующие (в соответствии с комментарием 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: Invalid индекс 8 для этого SqlParameterCollection с графом = 8.

Поскольку отображение данного лица такое же, как EntityWith2ColsPK:

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

HELP!

+0

Это дубликата вопрос http://stackoverflow.com/questions/4460648/how-to-map-composite- primary-key-to-foreign-in-fluent-nhibernate, так что вы можете найти anser по этой ссылке – AlfeG

+0

Это не решает мою проблему :( –

ответ

2

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

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

Большое вам спасибо, я провел весь уик-энд, пытаясь исследовать это, с нет успеха .. Я уверен, что я пробовал то, что вы мне дали, и, изменяя другие вещи, в то же время это провалилось. Теперь это работает :) Еще раз спасибо. –

+0

Возможно, вы захотите изменить имена столбцов в базе данных (если можете) на что-то другое, кроме id и type. Например, в таблице, называемой 'order', у вас будет столбец с именем' order_id'. –

+0

У меня проблема с этим ... потому что я хочу, чтобы «OrderID» обновлялся и вставлялся, но Type не отображался снова (потому что Type уже является частью CompositeId), поэтому он еще не решен –

 Смежные вопросы

  • Нет связанных вопросов^_^