Справочная информация:
Я работаю над устаревшей базой данных 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
mapping.IgnoreProperty(Function(x) x.IndividualEligibilityRecords)
? Я думаю ты можешь оставить это - person Firo   schedule 07.11.2011var result = session.Get<T0026_AG_ELIG>(new T0026_AG_ELIG{ CASE_NUM = caseNumber, PROGRAM_CD = programCode, SUBPROGRAM_CD = subProgramCode, AG_SEQ_NUM = agSequenceNumber, CAG_ELIG_SEQ_NUM = cagEligSequenceNumber })
как VB? - person Firo   schedule 08.11.2011