Отображение NHibernate SQL-VIEW без уникального идентификатора - PullRequest
0 голосов
/ 13 октября 2011

У меня есть только для чтения mssql- view , и я хочу сопоставить его с nhibernate (используя hbm.xml файлы).Представление является выбором, объединяющим две таблицы.Для получения абстрактного понимания, выбор - что-то вроде этого:

SELECT A.Id As A_ID, B.Id As B_ID,
       A.AttributeA, B.AttributeB,

FROM A INNER JOIN B ON 
     A.Id = B.RootID

Это отношение «один ко многим» между A и B (записи B являются зависимыми / листьями записей A).

Я использую файлы hbm.xml nhibernate, и я не могу заставить его работать.

Я был бы рад, если бы кто-то смог показать мне тот тип XML, который я должен использовать,Я предполагаю, что, поскольку у моего представления нет идентификатора, я должен создать составной идентификатор nhibernate (который будет идентификаторами OS и B вместе), но я не мог заставить его работать.Кроме того, представление только для чтения, поэтому я думаю, что это должно облегчить решение.

Я задаю вопрос, потому что никто из других на сайте не ответил на эту проблему (некоторые используют fluent-nhibernate, я сФайлы сопоставления XML)

заранее спасибо.

Ответы [ 2 ]

1 голос
/ 14 октября 2011

Спасибо Энди, что привело меня к окончательному решению. Я добавлю шаблон hbm.xml вместе с объектами моей доменной модели. Все отображаемые мной столбцы - это varchars / strings (следовательно, мой составной идентификатор состоит из двух строк):

    <class name="Model.Projects.ProjectsLoansView"
           table="V_PROJECTSLOANS" mutable="false">

    <composite-id>
      <key-property name="Number" column="Number"/>
      <key-property name="OperationNumber" column="OperationNumber" />
    </composite-id>

    <property name="Name" column="Name" not-null="false"/>

  </class>

Но картирования было недостаточно. Nhibernate просит переопределить функции Equals и GetHashCode, я поставлю точный код моего рабочего класса VB.Net, который соответствует этому XML:

  Public Class ProjectsLoansView

        Public Overridable Property Number As String
        Public Overridable Property OperationNumber As String

        Public Overridable Property Name As String

        Public Overloads Overrides Function Equals(ByVal obj As Object) As Boolean

            If (IsNothing(obj)) Then Return False

            Dim t As ProjectsLoansView = CType(obj, ProjectsLoansView)

            If ((Me.Number = t.Number) And (Me.OperationNumber = t.OperationNumber)) Then
                Return True
            Else
                Return False
            End If
        End Function

        Public Overrides Function GetHashCode() As Integer
            'TODO: check how to override properly GetHashCode. As is a-read only view it doesn't matter here
            Return MyBase.GetHashCode()
        End Function

    End Class
1 голос
/ 14 октября 2011

Ваш файл отображения должен выглядеть так:

<class name="blah" mutable="false">
  <composite-id>
    <key-property name="A_ID"/>
    <key-property name="B_ID"/>
  </composite-id>

  <property name="A.Attribute" />
  <property name="B.Attribute" />
</class>

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

...