我有一个只读 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映射文件)
提前感谢。
答案 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请求覆盖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