Hi I have a problem with the datagridview together with a nhibernate composite-id. I am wondering if you experts out there can help me with this.
As in my code under Button2_Click procedure, i want to display the pOR_NO. This is achieve by doing a directcast to DOrderDetails and then access it member pOrderDetails_ID for the pOR_NO. When i try to do this VB.net actually return me an exception saying that the "Object reference not set to an instance of an object."
When i try to access on the pDESC attribute the system can display the value but not for pOR_NO.
Hibernate Version: NHibernate 1.2
Mapping documents & Codes
Code:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Console.WriteLine(DateTime.Now)
cfg = New Configuration()
cfg.AddAssembly("classes")
factory = cfg.BuildSessionFactory()
session = factory.OpenSession()
bindSrc = New BindingSource
DataGridView1.AutoGenerateColumns = False
bindSrc.Add(New DOrderDetails())
DataGridView1.DataSource = bindSrc
Dim column As DataGridViewColumn
column = New DataGridViewCheckBoxColumn()
column.Name = "DEL"
DataGridView1.Columns.Add(column)
column = New DataGridViewTextBoxColumn()
column.DataPropertyName = "pOR_NO"
column.Name = "Order No"
DataGridView1.Columns.Add(column)
column = New DataGridViewTextBoxColumn()
column.DataPropertyName = "pDESC"
column.Name = "Description"
DataGridView1.Columns.Add(column)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim x As DOrderDetails= DirectCast(bindSrc.Item(DataGridView1.SelectedCells(0).RowIndex), DOrderDetails)
Console.WriteLine(x.pOrderDetails_ID.pOR_LINE) '<------------------Error here
End Sub
Code:
Imports System
Namespace Dialogue
Public Class DOrderDetails
Dim _OrderDetails_ID As DOrderDetails_ID
Dim _DESC As String
Dim _PRICE As Decimal
Dim _QTY As Integer
Public Sub New()
_OrderDetails_ID = New DOrderDetails_ID
End Sub
Public Overridable Property pOrderDetails_ID() As DOrderDetails_ID
Get
Return _OrderDetails_ID
End Get
Set(ByVal value As DOrderDetails_ID)
_OrderDetails_ID = value
End Set
End Property
Public Overridable Property pDESC() As String
Get
Return _DESC
End Get
Set(ByVal value As String)
_DESC = value
End Set
End Property
Public Overridable Property pPRICE() As Decimal
Get
Return _PRICE
End Get
Set(ByVal value As Decimal)
_PRICE = value
End Set
End Property
Public Overridable Property pQTY() As Integer
Get
Return _QTY
End Get
Set(ByVal value As Integer)
_QTY = value
End Set
End Property
End Class
Public Class DOrderDetails_ID
Dim _OR_NO As String
Dim _OR_LINE As Integer
Public Overridable Property pOR_NO() As String
Get
Return _OR_NO
End Get
Set(ByVal value As String)
_OR_NO = value
End Set
End Property
Public Overridable Property pOR_LINE() As Integer
Get
Return _OR_LINE
End Get
Set(ByVal value As Integer)
_OR_LINE = value
End Set
End Property
Public Overloads Overrides Function Equals(ByVal Obj As Object) As Boolean
Dim x As DOrderDetails_ID = DirectCast(Obj, DOrderDetails_ID)
Return Me.pOR_LINE = x.pOR_LINE And Me.pOR_NO = x.pOR_NO
End Function
Public Overloads Overrides Function GetHashCode() As Integer
Return New Random().Next()
End Function
End Class
End Namespace
Mapping file
Code:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Dialogue.DOrderDetails, classes" table="orderdetails">
<composite-id name="pOrderDetails_ID" class="Dialogue.DOrderDetails_ID, classes">
<key-property name="pOR_NO" column="OR_NO" type="String"/>
<key-property name="pOR_LINE" column="OR_LINE" type="Int32"/>
</composite-id>
<property name="pDESC" column="DESC" type="String"/>
<property name="pPRICE" column="PRICE" type="Decimal"/>
<property name="pQTY" column="QTY" type="Int32"/>
</class>
</hibernate-mapping>
Stacktrace:
at HiberNetTest.Form1.Button2_Click(Object sender, EventArgs e) in C:\Documents and Settings\bitMessen\My Documents\Visual Studio 2005\Projects\HiberNetTest\HiberNetTest\Form1.vb:line 225
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at