3

Я хочу указать как внешний ключ как собственность POCO и свойство навигации. IE в примере here, ответ заменяет внешний ключКарта внешнего ключа, а также ссылки в NHibernate без создания дополнительной колонки

public virtual int SongArtistID { get; set; } 

Я хочу, чтобы этот ключ в отображении. Я пробовал до сих пор:

Map(x => x.ParentID); 
References(x => x.Parent).Column("ParentID"); 

Map(x => x.ParentID); 
References(x => x.Parent, "ParentID"); 

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

ответ

4

Вы не сопоставляете одно и то же отношение дважды в NHibernate.

Это просто:

References(x => x.Parent, "ParentID") 

А затем использовать это, чтобы получить значение FK:

var parentId = obj.Parent.Id; 

Или это, чтобы назначить его:

obj.Parent = session.Load<TheClassOfTheParent>(parentId); 

И ни один из этих заявлений приведет к вызову db.

+1

Я не хочу, чтобы отобразить дважды, я просто хочу получить доступ к свойству как простому (например, int) свойству без каких-либо знаний об ORM, сеансе и т. д., только модель данных –

+0

Ну, это не сработает. NHibernate ориентирован на работу с объектной моделью, основанной на отношениях, а не на модели БД, основанной на внешних ключах. –

+1

На самом деле, это работает, проблема не была в 'Reference()' см. Мой ответ –

3

Как оказалось, сопоставление, как я показал, было прекрасно. Проблема с дополнительным полем была создана другой стороной отношений. То, что у меня было:

class ParentMap 

     HasMany(x => x.Children) 
      .Inverse() 
      .Cascade.All(); 

class ChildMap 

     Map(x => x.ParentID); 
     References(x => x.Parent).Column("ParentID"); 

Я должен был указать столбец на HasMany() родителя, а не на самом деле на Reference() ребенка, например, так:

class ParentMap 

     HasMany(x => x.Children) 
      .KeyColumn("ParentID") // Problem without this! 
      .Inverse() 
      .Cascade.All();