Справочная информация:
Я работаю над устаревшей базой данных DB2, поэтому не могу управлять схемой. Я искал ответы на этом сайте и не нашел ни одного. Я также искал в Google и не нашел подходящего ответа.
В описанных здесь таблицах используются составные ключи. У меня есть родительская таблица, в которой хранится информация о приемлемости для каждого «случая». Дочерняя таблица хранит информацию о праве на участие, касающуюся каждого лица, связанного с делом. Дочерние записи различаются по номеру пин-кода, чтобы сделать их уникальными только в дочерней таблице.
Я использую NHibernate v3.1 с Fluent NHibernate v1.2, оба получены через пакеты NuGet. Объекты сопоставляются с использованием функции автоматического сопоставления Fluent NHibernate. Любое пользовательское сопоставление выполняется в методе переопределения сопоставления для каждого объекта.
Еще одна вещь, которую нужно знать, это то, что у этих таблиц нет «первичного ключа», определенного в DB2. Они имеют только «уникальные ключи», которые вы видите в определении составного ключа ниже (см. Код).
T0026_AG_ELIG - это имя родительской таблицы и соответствующий класс POCO.
T0265_AG_IN_ELIG - это имя дочерней таблицы и соответствующего класса POCO.
Проблема:
Проблема в том, что когда я выполняю запрос, запрашиваются все данные, родительская запись успешно сопоставляется с классом, но возвращенные дочерние строки не отображаются в коллекцию родительского класса. NHibernate генерирует запросы для родительских и дочерних данных. Когда я выполняю свой собственный запрос к базе данных, верные данные для условий возвращаются. По какой-то причине дочерние записи просто не связаны со свойством родительского (T0026) класса.
Вопрос:
Что мне нужно сделать, чтобы получить несколько строк, возвращающихся из T0265_AG_IN_ELIG, для сопоставления их соответствующему классу и загрузки в указанное свойство коллекции родительского класса (T0026_AG_ELIG)?
Собственность родительского свойства (T0026_AG_ELIG):
Public Overridable Property IndividualEligibilityRecords As IList(Of T0265_AG_IN_ELIG)
Переопределение сопоставления для родителя (T0026_AG_ELIG):
mapping.CompositeId() _
.KeyProperty(Function(x) x.CASE_NUM) _
.KeyProperty(Function(x) x.PROGRAM_CD) _
.KeyProperty(Function(x) x.SUBPROGRAM_CD) _
.KeyProperty(Function(x) x.AG_SEQ_NUM) _
.KeyProperty(Function(x) x.CAG_ELIG_SEQ_NUM)
mapping.HasMany(Of T0265_AG_IN_ELIG)(Function(x) x.IndividualEligibilityRecords) _
.Cascade.All() _
.Inverse() _
.Fetch.Join() _
.KeyColumns.Add("CASE_NUM") _
.KeyColumns.Add("PROGRAM_CD") _
.KeyColumns.Add("SUBPROGRAM_CD") _
.KeyColumns.Add("AG_SEQ_NUM") _
.KeyColumns.Add("CAG_ELIG_SEQ_NUM") _
.Not.LazyLoad() _
.AsList(Function(x) x.Column("PIN_NUM"))
mapping.IgnoreProperty(Function(x) x.IndividualEligibilityRecords)
Переопределение сопоставления для ребенка (T0265_AG_IN_ELIG):
mapping.CompositeId() _
.KeyProperty(Function(x) x.CASE_NUM) _
.KeyProperty(Function(x) x.PROGRAM_CD) _
.KeyProperty(Function(x) x.SUBPROGRAM_CD) _
.KeyProperty(Function(x) x.AG_SEQ_NUM) _
.KeyProperty(Function(x) x.CAG_ELIG_SEQ_NUM) _
.KeyProperty(Function(x) x.PIN_NUM)
Следующий код выполняется для выполнения запроса:
transaction = session.BeginTransaction()
query = session.CreateQuery("FROM T0026_AG_ELIG AS T0026 " _
& "WHERE T0026.CASE_NUM = :p0 AND T0026.PROGRAM_CD = :p1 AND " _
& "SUBPROGRAM_CD = :p2 AND AG_SEQ_NUM = :p3 AND CAG_ELIG_SEQ_NUM = :p4")
query.SetParameter("p0", caseNumber)
query.SetParameter("p1", programCode)
query.SetParameter("p2", subProgramCode)
query.SetParameter("p3", agSequenceNumber)
query.SetParameter("p4", cagEligSequenceNumber)
result = query.List()
transaction.Commit()
If result.Count = 1 Then
Return DirectCast(result.Item(0), T0026_AG_ELIG)
End If