Пожалуйста, помогите мне воплотить это простое беглое отображение nhibernate в жизнь - PullRequest
0 голосов
/ 08 августа 2011

Ну, все кажется таким простым, и все же я не могу найти ответ на мою проблему.

Допустим, у меня есть 2 таблицы TableA и TableB, которые могут содержать одну ссылку на 3-ю таблицу:

TableA       TableB        TableC
ID           ID            ID
TableC_ID    TableC_ID     RandomDataC
RandomDataA  RandomDataB

Каждый представлен следующими классами:

public Class ClassA{
  public virtual int Id{get;set;}
  public virtual ClassC ObjAC{get;set;}
  ...
}

public Class ClassB{
  public virtual int Id{get;set;}
  public virtual ClassC ObjBC{get;set;}
  ...
}

public Class ClassC{
  public virtual int Id{get;set;}
  ...
}

Как видите, ClassA и ClassB содержат одно свойство под названием ClassC.

Я пробовал следующее отображение (среди прочего ...)

 public Class ClassAMap : ClassMap<ClassA>{
    public ClassAMap(){
       Id(x => x.Id);
       HasOne(x => x.ObjAC).Cascade.All();
       ...
    }
 }

 public Class ClassBMap : ClassMap<ClassB>{
    public ClassBMap(){
       Id(x => x.Id);
       HasOne(x => x.ObjBC).Cascade.All();
       ...
    }
 }

 public Class ClassCMap : ClassMap<ClassC>{
    public ClassCMap(){
       Id(x => x.Id);
    }
 }

но отображение неверное. Я пытался ClassCMap иметь ReferencesAny, но безуспешно.

Пожалуйста, помогите ...

Ответы [ 3 ]

2 голосов
/ 08 августа 2011

Попробуйте:

public Class ClassAMap : ClassMap<ClassA>{
    public ClassAMap(){
       Id(x => x.Id);
       References(x => x.ObjAC, "TableC_ID").Cascade.All();
       ...
    }
 }

 public Class ClassBMap : ClassMap<ClassB>{
    public ClassBMap(){
       Id(x => x.Id);
       References(x => x.ObjBC, "TableC_ID").Cascade.All();
       ...
    }
 }

 public Class ClassCMap : ClassMap<ClassC>{
    public ClassCMap(){
       Id(x => x.Id);
    }
 }

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

1 голос
/ 08 августа 2011

При использовании HasOne это означает, что ваша таблица использует один и тот же первичный ключ с другой таблицей.В вашем случае это не так.Классы A, B и C имеют свои идентификаторы.Проверьте следующую статью, которая объясняет это более подробно:

http://jagregory.com/writings/i-think-you-mean-a-many-to-one-sir/

0 голосов
/ 08 августа 2011

Возможно, вам нужно использовать References вместо HasOne.HasOne имеет уникальный случай использования.Заменить HasOne на References.Я не верю .Cascade.All () также необходим.

Вы можете проверить использование HasOne здесь: http://wiki.fluentnhibernate.org/Fluent_mapping.

...