【问题标题】:NHibernate mapping SQL-VIEW without unique identifier没有唯一标识符的 NHibernate 映射 SQL-VIEW
【发布时间】:2011-12-07 04:32:45
【问题描述】:

我有一个 只读 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,我必须创建一个复合休眠 id(这将是 ids os A和B一起)但我无法让它工作。 该视图也是只读的,所以我认为这应该使解决方案更容易。

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

提前致谢。

【问题讨论】:

  • 您在定义复合 ID 时遇到了哪些错误?
  • 在我试图给出的这个抽象示例中,存在一个概念错误:由于 B 条目仅依赖于一个 A 条目,因此 B 的 ID 可以用作连接表的 ID (因为不会有任何 B 条目超过一次),所以不需要复合 id。
  • ... 但是,如果连接是 LEFT OUTER JOIN 而不是我的问题中的内部连接,则仍然需要复合 ID。

标签: vb.net nhibernate mapping nhibernate-mapping


【解决方案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>

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

【讨论】:

  • 感谢这个模板引导我找到解决方案,因为我可以获得更详细的 nhibernate 异常来解决问题
【解决方案2】:

感谢安迪,这使我找到了最终解决方案。 我会将 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 请求覆盖 ​​Equals 和 GetHashCode 函数,我将放置与此 XML 对应的工作 VB.Net 类的确切代码:

  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

【讨论】:

    猜你喜欢
    • 2012-05-14
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多