多對(duì)多關(guān)系在數(shù)據(jù)庫(kù)也是比較常見(jiàn)的,它通過(guò)一個(gè)中間表將兩個(gè)主表關(guān)聯(lián)起來(lái)。
下面來(lái)看看多對(duì)多關(guān)聯(lián)在nh的實(shí)現(xiàn),示例是一個(gè)User和Group之間的多對(duì)多關(guān)聯(lián)。
先來(lái)看看User類的映射信息:
在多對(duì)多定義中,定義了中間表為UserGroups,此表只有兩個(gè)字段:user_id和group_id;用于關(guān)聯(lián)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
這里用一個(gè)數(shù)據(jù)字典IDictionary對(duì)角來(lái)保存組對(duì)象。
再來(lái)看看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
注意:多對(duì)多沒(méi)有主次之分,保存時(shí)的兩邊都要save!
下面給出部分測(cè)試代碼。
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();
}
}
以上測(cè)試代碼中session的相關(guān)操作請(qǐng)查看相關(guān)文檔。
在實(shí)際應(yīng)用中,我較少使用many-to-many映射,當(dāng)然這要從性能和實(shí)際需要考慮。
我的做法是一個(gè)elements來(lái)取得所有關(guān)聯(lián)的identity,
然后在需要的時(shí)候才加載對(duì)象,有點(diǎn)類似lazy,
但lazy有一個(gè)問(wèn)題,就是session必須沒(méi)有被釋放,這在分層開(kāi)發(fā)中較難辦到。
原文:
http://www.seaskyer.net/Index/Catalog44/182.html