多對多關系在數據庫也是比較常見的,它通過一個中間表將兩個主表關聯起來。
下面來看看多對多關聯在nh的實現,示例是一個User和Group之間的多對多關聯。
先來看看User類的映射信息:
在多對多定義中,定義了中間表為UserGroups,此表只有兩個字段:user_id和group_id;用于關聯Users和Groups表。
User的定義:
public class User
{
public User() {
}
public int UserId
{
get { return userId; }
set { userId = value; }
}
public
int Name
{
get { return name; }
set { name = value;
}
}
public IDictionary Groups
{
get { return
groups; }
set { groups = value; }
}
private int
userId;
private string name;
private IDictionary groups = new
Hashtable();
} //class
User
這里用一個數據字典IDictionary對角來保存組對象。
再來看看Group類的映射信息:
這里many-to-many的定義和User類映射信息中的差不多。
組類的定義:
public class Group
{
public Group() {
}
public int GroupId
{
get { return groupId; }
set { groupId = value; }
}
public int Name
{
get { return name; }
set {
name = value; }
}
public int Description
{
get {
return description; }
set { description = value; }
}
public IDictionary Users
{
get { return users; }
set {
users = value; }
}
private int groupId;
private string
name;
private IDictionary users = new Hashtable();
} //class
Group
注意:多對多沒有主次之分,保存時的兩邊都要save!
下面給出部分測試代碼。
public TestCreate()
{
User user1 = new User();
user1.Name = "test1";
User user2 =
new User();
user2.Name = "test2";
Group group1 = new
Group();
group1.Name = "group1";
Group group2 = new Group();
group2.Name = "group2";
user1.Groups.Add( group2, group2 );
user2.Groups.Add( group1. group1 );
group1.Users.Add( user2, user2
);
group2.Users.Add( user1, user1 );
ITransactioin trans =
null;
try {
trans = session.BeginTransaction();
Session.Save( user1 );
Session.Save( user2 );
Session.Save(
group1 );
Session.Save( group2 );
trans.Commit();
}
catch ( Exception e ) {
if ( trans != null )
trans.Rollback();
throw e;
}
finally {
session.Close();
}
}
以上測試代碼中session的相關操作請查看相關文檔。
在實際應用中,我較少使用many-to-many映射,當然這要從性能和實際需要考慮。
我的做法是一個elements來取得所有關聯的identity,
然后在需要的時候才加載對象,有點類似lazy,
但lazy有一個問題,就是session必須沒有被釋放,這在分層開發中較難辦到。
原文:
http://www.seaskyer.net/Index/Catalog44/182.html