本文主要描述了如何使用Castle.ActiveRecord處理Many-To-Many映射。本文主要涉及了兩個類:Student(學生)、Subject(學科),這兩個類的關系是多對多的,因為一個學生學習多個學科,一個學科可以被多個學生學,下面是類圖:

主要內容:
1.編寫數據庫腳本
2.HasAndBelongsToMany屬性說明
3.編寫實體類
4.編寫調用代碼
一、編寫數據庫腳本
由於Student與Subject是多對多關系,這裡加入一個關聯表Student_Subject來保存這些關系
Create Table [Student] ( ID int identity(1,1) primary key, StudentName Varchar(50) not null ) Create Table [Subject] ( ID int identity(1,1) primary key, SubjectName Varchar(50) not null ) Create Table [Student_Subject] ( StudentID int not null, SubjectID int not null, )
二、HasAndBelongsToMany屬性說明
在Castle.ActiveRecord中用HasAndBelongsToMany屬性處理多對多關系,該屬性必須包含以下三個子屬性:
1.Table:指出關聯表表名(本文為Student_Subject);
2.ColumnKey:指出關聯表中指向本實體類數的列名;
3.ColumnRef:指出關聯表中指向另一個實體類的列名.
//Subject.cs
//Table指出關聯表:Student_Subject
//ColumnKey:指出關聯表(Student_Subject)中指向本實體類(Subject)的列名(SubjectID)
//ColumnRef:指出關聯表(Student_Subject)中指向另一實體類(Student)的列名(StudentID)
[HasAndBelongsToMany(typeof(Student), Table = "Student_Subject", ColumnRef = "StudentID", ColumnKey = "SubjectID")]
public IList StudentList
{
get
{
return ilStudent;
}
set
{
ilStudent = value;
}
}
除了以上三個必須子屬性外,HasAndBelongsToMany屬性還有以下幾個常用子屬性:
1.Cascade:指明哪些操作會從父對象級聯到關聯的對象.該屬性值應為CascadeEnum枚舉值之一:
a) None(默認值):不進行級聯操作;
b) All:表示父對象的任何操作都會關聯到級聯對象;
c) Delete:表示只有對父對象進行刪除操作時才會關聯到級聯對象;
d) SaveUpdate:表示只有對父對象進行保存、更新操作時才會關聯到級聯對象.
2.Inverse:指定是否進行級聯操作;
3.Schema:指定Schema名;
4.Where:指定一個附加SQL的Where子句,這裡應該寫HQL語句;
5.Lazy:指定是否延遲加載級聯對象.
三、編寫實體類
Student.cs: /**////jailusd@hotmail.com
///2006-09-24
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using Castle.ActiveRecord;
namespace ManyToMany
{
[ActiveRecord]
public class Student : ActiveRecordBase
{
private int intID;
private string strName;
private IList ilSubject;
public Student()
{
intID = 0;
strName = string.Empty;
ilSubject = new ArrayList();
}
[PrimaryKey(PrimaryKeyType.Identity,"ID")]
public int ID
{
get
{
return intID;
}
set
{
intID = value;
}
}
[Property("StudentName")]
public string Name
{
get
{
return strName;
}
set
{
strName = value;
}
}
//Table指向關聯表:Student_Subject
//ColumnKey:指出關聯表(Student_Subject)中指向本實體類(Student)的列名(StudentID)
//ColumnRef:指出關聯表(Student_Subject)中指向另一實體類(Subject)的列名(SubjectID)
[HasAndBelongsToMany(typeof(Subject), Table = "Student_Subject", ColumnRef = "SubjectID", ColumnKey = "StudentID")]
public IList SubjectList
{
get
{
return ilSubject;
}
set
{
ilSubject = value;
}
}
}
}
Subject.cs: /**////jailusd@hotmail.com
///2006-09-24
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using Castle.ActiveRecord;
namespace ManyToMany
{
[ActiveRecord]
public class Subject : ActiveRecordBase
{
private int intID;
private string strName;
private IList ilStudent;
public Subject()
{
intID = 0;
strName = string.Empty;
ilStudent = new ArrayList();
}
[PrimaryKey(PrimaryKeyType.Identity,"ID")]
public int ID
{
get
{
return intID;
}
set
{
intID = value;
}
}
/**//// <summary>
/// 學科名
/// </summary>
[Property("SubjectName")]
public string Name
{
get
{
return strName;
}
set
{
strName = value;
}
}
//Table指向關聯表:Student_Subject
//ColumnKey:指出關聯表(Student_Subject)中指向本實體類(Subject)的列名(SubjectID)
//ColumnRef:指出關聯表(Student_Subject)中指向另一實體類(Student)的列名(StudentID)
[HasAndBelongsToMany(typeof(Student), Table = "Student_Subject", ColumnRef = "StudentID", ColumnKey = "SubjectID")]
public IList StudentList
{
get
{
return ilStudent;
}
set
{
ilStudent = value;
}
}
}
}
四、編寫調用代碼(只列舉添加Student對象的程序)
private void button1_Click(object sender, EventArgs e)
{
IConfigurationSource source = System.Configuration.ConfigurationManager.GetSection("activerecord") as IConfigurationSource;
ActiveRecordStarter.Initialize(source, typeof(ManyToMany.Student), typeof(ManyToMany.Subject));
//使用事務處理
using (TransactionScope tran = new TransactionScope())
{
ManyToMany.Student objStudent = new ManyToMany.Student();
objStudent.Name = "jailu";
for (int i = 0; i < 5; i++)
{
ManyToMany.Subject objSubject = new ManyToMany.Subject();
objSubject.Name = "Subject " + i.ToString();
objSubject.Create(); //這句千萬不能少,若則會出錯
objStudent.SubjectList.Add(objSubject);
objSubject = null;
}
objStudent.Save();
}
}
在保存Student對象objStudent時必須保證objStudent.SubjectList中的Subject對象已存在數據庫中,否則是無法保存Student對象的!