Vb.net 无唯一标识符的NHibernate映射SQL-VIEW

Vb.net 无唯一标识符的NHibernate映射SQL-VIEW,vb.net,nhibernate,mapping,nhibernate-mapping,Vb.net,Nhibernate,Mapping,Nhibernate Mapping,我有一个只读的mssql-视图,我想将它映射到nhibernate(使用hbm.xml文件)。 该视图是连接两个表的select。为了提供抽象的见解,选择如下: 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文件,但

我有一个只读的mssql-视图,我想将它映射到nhibernate(使用hbm.xml文件)。 该视图是连接两个表的select。为了提供抽象的见解,选择如下:

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(将ID os a和B放在一起),但我无法使它工作。 此外,该视图是只读的,因此我认为这将使解决方案更容易

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


提前感谢。

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

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


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

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


在我试图给出的这个抽象示例中,有一个概念上的错误:由于B项仅依赖于一个a项,那么B的ID可以用作联接表的ID(因为不会有任何B项多次存在),因此不需要复合ID。。。。但是,如果联接是
左外部联接
,而不是我的问题中的内部联接,则仍然需要复合id。感谢此模板,我找到了解决方案,因为我可以获得更详细的nhibernate异常来解决此问题
    <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>
  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