NHibernate: One-to-Many一对多映射(VB.NET版)
/*
作者:飞鹰
ASP酷技术资讯网()版权所有,如转载,请保留此信息.
*/
终于使用NHibernate作为项目研究的ORM框架,这次研究只是为了证明一件事,那就是使用ORM后可以提高程序的开发效率和优化程序的结构。
由于CRUD都可以实现了,所以,我就参照张老三的文章来做One-To-Many的例子。这里我使用SQL Server自带的NorthWind中的两个表Customers,Orders来做例子,我把Customers类作为父类,Orders类作为子类。
我们先用Cool Coder生成XML文件和C#代码,再用C#2VB转换器把C#代码转变成VB代码(为什么要转来转去呢?等过几天有空了,我升级Cool Coder,使之也可以生成VB代码,先临时凑合着用吧!)。稍作修改后就可以得到下面的内容。
先看Customers的映射信息:
xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class table="Customers">
<id column="CustomerID" type="String(5)">
<generator />
id>
<set inverse="true" lazy="true">
<key column="CustomerID" />
<one-to-many />
set>
<property type="String(40)" column="CompanyName" />
<property type="String(30)" column="ContactName" />
<property type="String(30)" column="ContactTitle" />
<property type="String(60)" column="Address" />
<property type="String(15)" column="City" />
<property type="String(15)" column="Region" />
<property type="String(10)" column="PostalCode" />
<property type="String(15)" column="Country" />
<property type="String(24)" column="Phone" />
<property type="String(24)" column="Fax" />
class>
hibernate-mapping>
Customers类的代码如下:
Imports System
Public Class Customers
Public Sub New()
End Sub 'New
Dim m_orderList As IDictionary = New Hashtable
'*
'* Property OrderList ( IDictionary)
'*
Public Property Orders() As IDictionary
Get
Return m_orderList
End Get
Set(ByVal Value As IDictionary)
m_orderList = Value
End Set
End Property
Private _Region As System.String
Public Property [Region]() As System.String
Get
Return _Region
End Get
Set(ByVal Value As System.String)
_Region = Value
End Set
End Property
Private _PostalCode As System.String
Public Property PostalCode() As System.String
Get
Return _PostalCode
End Get
Set(ByVal Value As System.String)
_PostalCode = Value
End Set
End Property
Private _Fax As System.String
Public Property Fax() As System.String
Get
Return _Fax
End Get
Set(ByVal Value As System.String)
_Fax = Value
End Set
End Property
Private _ContactName As System.String
Public Property ContactName() As System.String
Get
Return _ContactName
End Get
Set(ByVal Value As System.String)
_ContactName = Value
End Set
End Property
Private _City As System.String
Public Property City() As System.String
Get
Return _City
End Get
Set(ByVal Value As System.String)
_City = Value
End Set
End Property
Private _CustomerID As System.String
Public Property CustomerID() As System.String
Get
Return _CustomerID
End Get
Set(ByVal Value As System.String)
_CustomerID = Value
End Set
End Property
Private _Address As System.String
Public Property Address() As System.String
Get
Return _Address
End Get
Set(ByVal Value As System.String)
_Address = Value
End Set
End Property
Private _ContactTitle As System.String
Public Property ContactTitle() As System.String
Get
Return _ContactTitle
End Get
Set(ByVal Value As System.String)
_ContactTitle = Value
End Set
End Property
Private _Phone As System.String
Public Property Phone() As System.String
Get
Return _Phone
End Get
Set(ByVal Value As System.String)
_Phone = Value
End Set
End Property
Private _CompanyName As System.String
Public Property CompanyName() As System.String
Get
Return _CompanyName
End Get
Set(ByVal Value As System.String)
_CompanyName = Value
End Set
End Property
Private _Country As System.String
Public Property Country() As System.String
Get
Return _Country
End Get
Set(ByVal Value As System.String)
_Country = Value
End Set
End Property
End Class 'Customers
Orders类的映射信息如下:
xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class table="Orders">
<id column="OrderID" type="Int32">
<generator />
id>
<many-to-one column="CustomerID"/>
<property type="Int32" column="EmployeeID" />
<property type="DateTime" column="OrderDate" />
<property type="DateTime" column="RequiredDate" />
<property type="DateTime" column="ShippedDate" />
<property type="Int32" column="ShipVia" />
<property type="Decimal" column="Freight" />
<property type="String(40)" column="ShipName" />
<property type="String(60)" column="ShipAddress" />
<property type="String(15)" column="ShipCity" />
<property type="String(15)" column="ShipRegion" />
<property type="String(10)" column="ShipPostalCode" />
<property type="String(15)" column="ShipCountry" />
class>
hibernate-mapping>
Orders类的代码如下:
_
Public Class Orders
Public Sub New()
End Sub 'New
Private _OrderDate As System.DateTime
Public Property OrderDate() As System.DateTime
Get
Return _OrderDate
End Get
Set(ByVal Value As System.DateTime)
_OrderDate = value
End Set
End Property
Private _ShipName As System.String
Public Property ShipName() As System.String
Get
Return _ShipName
End Get
Set(ByVal Value As System.String)
_ShipName = value
End Set
End Property
Private _ShippedDate As System.DateTime
Public Property ShippedDate() As System.DateTime
Get
Return _ShippedDate
End Get
Set(ByVal Value As System.DateTime)
_ShippedDate = value
End Set
End Property
Private _ShipPostalCode As System.String
Public Property ShipPostalCode() As System.String
Get
Return _ShipPostalCode
End Get
Set(ByVal Value As System.String)
_ShipPostalCode = value
End Set
End Property
Private _ShipCity As System.String
Public Property ShipCity() As System.String
Get
Return _ShipCity
End Get
Set(ByVal Value As System.String)
_ShipCity = value
End Set
End Property
Private _ShipAddress As System.String
Public Property ShipAddress() As System.String
Get
Return _ShipAddress
End Get
Set(ByVal Value As System.String)
_ShipAddress = value
End Set
End Property
Private _ShipCountry As System.String
Public Property ShipCountry() As System.String
Get
Return _ShipCountry
End Get
Set(ByVal Value As System.String)
_ShipCountry = value
End Set
End Property
Private _OrderID As System.Int32
Public Property OrderID() As System.Int32
Get
Return _OrderID
End Get
Set(ByVal Value As System.Int32)
_OrderID = value
End Set
End Property
Private _RequiredDate As System.DateTime
Public Property RequiredDate() As System.DateTime
Get
Return _RequiredDate
End Get
Set(ByVal Value As System.DateTime)
_RequiredDate = value
End Set
End Property
Private _EmployeeID As System.Int32
Public Property EmployeeID() As System.Int32
Get
Return _EmployeeID
End Get
Set(ByVal Value As System.Int32)
_EmployeeID = value
End Set
End Property
Private _ShipVia As System.Int32
Public Property ShipVia() As System.Int32
Get
Return _ShipVia
End Get
Set(ByVal Value As System.Int32)
_ShipVia = value
End Set
End Property
Private _Freight As System.Decimal
Public Property Freight() As System.Decimal
Get
Return _Freight
End Get
Set(ByVal Value As System.Decimal)
_Freight = value
End Set
End Property
Private _ShipRegion As System.String
Public Property ShipRegion() As System.String
Get
Return _ShipRegion
End Get
Set(ByVal Value As System.String)
_ShipRegion = value
End Set
End Property
Public Property Customers() As Customers
Get
Return _Customer
End Get
Set(ByVal Value As Customers)
_Customer = Value
End Set
End Property
Private _Customer As Customers
End Class 'Orders
下面给出调用代码,如下:
ExportSchema(New String() {"Customers.hbm.xml", "Orders.hbm.xml"}, False)
Dim s As ISession = sessions.OpenSession()
Dim t As ITransaction = s.BeginTransaction()
Try
Dim customer As New Customers
Dim order As New Orders
order.ShipCity = "GuangDong"
order.EmployeeID = 1
order.ShipVia = 2
order.Customers = customer
With customer
.Address = "Softwarepark"
.City = "Xian"
.CompanyName = "GPCT111"
.ContactName = "Tim"
.ContactTitle = "title"
.Country = "China"
.Region = "Asia"
.CustomerID = "023"
.Orders.Add(order, order)
End With
s.Save(customer)
t.Commit()
Catch ex As Exception
t.Rollback()
Throw ex
Finally
s.Close()
End Try
上面程序在我的机器上运行通过。