在使用NHibernate的时候,我们经常会出现复合主键的情况;当然你可以再增加一个自增长ID也是其中的办法,如果要使用复合主键如何来操作呢?
事实上复合主键与单个主键是一样的概念,唯一不同的地方有两个:
(1)hbml配置文件对主键的配置不同
这是复合键定义:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="ISSP.Domain.ShippingList,ISSP.Domain" table="ExShippingList">
<composite-id name="ShippingPK" class="ISSP.Domain.ShippingListPK,ISSP.Domain">
<key-property name="ShippingOrderNo" type="String" column="ShippingOrderNo" />
<key-property name="TransOrderNo" type="String" column="TransOrderNo"/>
</composite-id>
<property column="IsTransit" type="Boolean" name="IsTransit" not-null="true" />
</class>
</hibernate-mapping>
(2)对于定义的实体类中,主键的类型应该也是一个类来定义,如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization;
using System.ComponentModel;
using System.Text.RegularExpressions;
namespace ISSP.Domain
{
/// <summary>
/// ExShippingList
/// </summary>
[Serializable]
public class ShippingList
{
private ShippingListPK shippingPK;
public virtual ShippingListPK ShippingPK
{
set
{
shippingPK = value;
}
get
{
return shippingPK;
}
}
private Boolean isTransit;
/// <summary>
/// IsTransit
/// </summary>
public virtual Boolean IsTransit
{
get
{
return isTransit;
}
set
{
isTransit = value;
}
}
/// <summary>
/// 判断两个对象是否相同,这个方法需要重写
/// </summary>
/// <param name="obj">进行比较的对象</param>
/// <returns>真true或假false</returns>
public override bool Equals(object obj)
{
if (obj is ShippingList)
{
ShippingList second = obj as ShippingList;
if (this.ShippingPK.ShippingOrderNo == second.ShippingPK.ShippingOrderNo
&& this.ShippingPK.TransOrderNo == second.ShippingPK.TransOrderNo)
{
return true;
}
else return false;
}
return false;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization;
using System.ComponentModel;
using System.Text.RegularExpressions;
namespace ISSP.Domain
{
/// <summary>
/// 复合主键类
/// </summary>
[Serializable]
public class ShippingListPK
{
private String shippingOrderNo;
/// <summary>
/// ShippingOrderNo
/// </summary>
public virtual String ShippingOrderNo
{
get
{
return shippingOrderNo;
}
set
{
shippingOrderNo = value;
}
}
private String transOrderNo;
/// <summary>
/// TransOrderNo
/// </summary>
public virtual String TransOrderNo
{
get
{
return transOrderNo;
}
set
{
transOrderNo = value;
}
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
}
解决了以上两个问题,其他问题都不是问题了,写法是一样的。
当然,要注意要重写以下两个方法:Equals GetHashcode....
抛砖引玉,写得不清楚多见谅!