NHibernate映射SQL-VIEW没有唯一标识符

时间:2011-10-13 18:03:46

标签: vb.net nhibernate mapping nhibernate-mapping

我有一个只读 mssql- 视图,我想将其映射到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条目的依赖/叶子)。

我正在使用nhibernate的hbm.xml文件,我无法使其工作。

我很高兴地感谢有人能够使用我必须使用的那种XML,我想因为我的视图没有ID,所以我必须创建一个复合nhibernate id(这将是ids os A和B在一起)但我无法使它工作。 此视图也是READ ONLY,所以我认为这应该使解决方案更容易。

我问这个问题,因为网站上没有其他人回答过这个问题(有些人使用流利的nhibernate,我使用的是XML映射文件)

提前感谢。

2 个答案:

答案 0 :(得分:1)

您的映射文件应如下所示:

<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>

这是否正确映射到您的视图?如果没有,请告诉我你还试过了什么。

答案 1 :(得分:1)

感谢Andy,这引导我找到最终的解决方案。 我将把hbm.xml模板与我的域模型实体放在一起。 我映射的所有列都是varchars / strings(因此我的复合ID由两个字符串组成):

    <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请求覆盖EqualsGetHashCode函数,我将把我工作的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