2011-02-03 1 views
0

Я использую nHibernate на веб-странице для просмотра элементов из уже существующей базы данных. У меня возникли проблемы с объединением двух таблиц. Две таблицы имеют общее имя столбца, которое мне нужно перекрестно ссылаться. Конечно, я бы разработал таблицы немного по-другому, чтобы лучше использовать ссылочный идентификатор, но поскольку это устаревшая база данных, мне действительно нужно выяснить, как настроить мою карту для работы с существующей схемой.Помогите связать две таблицы, которые имеют общий столбец базы данных в nHibernate, используя HasOne

Я пытаюсь использовать отношения HasOne между двумя таблицами (я также могу видеть, как это может вписаться в ManyToOne), но я просто не могу заставить ничего работать с правильными результатами ... Имея исчерпал мой кеш Google. Теперь я надеюсь, что кто-то сможет предложить некоторые быстрые идеи о том, что я делаю неправильно.

Первая таблица называется «Отчет», которая хочет загрузить объект из другой таблицы под названием «Операционная система»; Оба имеют общее поле «Report_Number»

Классы модели выглядеть следующим образом:

public class ReportModel 
    { 
    public virtual int Report_Number { get; set; } 
    public virtual OperatingSystemsModel OperatingSystem { get; set; } 
    } 
    public class OperatingSystemsModel 
    { 
    public virtual string OS_Name { get; set; } 
    public virtual int Report_Number { get; set; } 
    } 

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

В таблице отображения выглядеть следующим образом:

public ReportMap() 
{ 
    Table("pcd_PROBLEM40"); 
    Id(x => x.Report_Number).Column("Report_Number").GeneratedBy.Native(); 
    HasOne(x => x.OperatingSystem).PropertyRef(x => x.Report_Number).ForeignKey("Report_Number"); 
} 
public OperatingSystemsMap() 
{ 
    Table("pcd_os_names"); 
    Id(x => x.Report_Number).Column("Report_Number").GeneratedBy.Native(); 
    Map(x => x.OS_Name); 
} 

Цель в том, что объект OperatingSystem в ReportModel будет получать правильно с общей Report_number Фейлд.

Я пробовал различные комбинации HasOne() с PropertyRef() и ForeignKey(), но, похоже, не может получить тот, который работает. Я получаю следующее исключение, когда пытаюсь получить отчет.

{ "Неизвестный столбец 'operatings2_.Report_Number' в" списке поля"}

public static ReportModel GetReport(int i_iReportNumber) 
{ 
    ICriteria criteria = Session.CreateCriteria(typeof(ReportModel)); 
    criteria.Add(Restrictions.Eq("Report_Number", i_iReportNumber)); 
    return criteria.UniqueResult<ReportModel>(); 
} 

Любые идеи будут очень, очень высокую оценку!

ответ

0

Попытка:

HasOne (х => x.OperatingSystem);

Или

HasOne (х => x.OperatingSystem) .Constrained();

Также обратите внимание на this post on brunoreis.com для получения дополнительной справки по синтаксису HasOne:

+0

Wahoo !!! Это сработало! – user602046

+0

Приятно это слышать. – kgrandpak