本文主要描述了如何使用Castle.ActiveRecord处理Many-To-Many映射。本文主要涉及了两个类:Student(学生)、Subject(学科),这两个类的关系是多对多的,因为一个学生学习多个学科,一个学科可以被多个学生学,下面是类图:
ActiveRecord学习笔记(四):处理Many-To-Many映射

主要内容:
1.编写数据库脚本
2.HasAndBelongsToMany属性说明
3.编写实体类
4.编写调用代码

一、编写数据库脚本
  由于Student与Subject是多对多关系,这里加入一个关联表Student_Subject来保存这些关系
ActiveRecord学习笔记(四):处理Many-To-Many映射Create Table [Student]
ActiveRecord学习笔记(四):处理Many-To-Many映射(
ActiveRecord学习笔记(四):处理Many-To-Many映射  ID 
int identity(1,1primary key,
ActiveRecord学习笔记(四):处理Many-To-Many映射  StudentName 
Varchar(50not null
ActiveRecord学习笔记(四):处理Many-To-Many映射)
ActiveRecord学习笔记(四):处理Many-To-Many映射
ActiveRecord学习笔记(四):处理Many-To-Many映射
Create Table [Subject]
ActiveRecord学习笔记(四):处理Many-To-Many映射(
ActiveRecord学习笔记(四):处理Many-To-Many映射  ID 
int identity(1,1primary key,
ActiveRecord学习笔记(四):处理Many-To-Many映射  SubjectName 
Varchar(50not null
ActiveRecord学习笔记(四):处理Many-To-Many映射)
ActiveRecord学习笔记(四):处理Many-To-Many映射
ActiveRecord学习笔记(四):处理Many-To-Many映射
Create Table [Student_Subject]
ActiveRecord学习笔记(四):处理Many-To-Many映射(
ActiveRecord学习笔记(四):处理Many-To-Many映射  StudentID 
int not null,
ActiveRecord学习笔记(四):处理Many-To-Many映射  SubjectID 
int not null,
ActiveRecord学习笔记(四):处理Many-To-Many映射)

二、HasAndBelongsToMany属性说明
  在Castle.ActiveRecord中用HasAndBelongsToMany属性处理多对多关系,该属性必须包含以下三个子属性:
  1.Table:指出关联表表名(本文为Student_Subject);
  2.ColumnKey:指出关联表中指向本实体类数的列名;
  3.ColumnRef:指出关联表中指向另一个实体类的列名。
ActiveRecord学习笔记(四):处理Many-To-Many映射//Subject.cs
ActiveRecord学习笔记(四):处理Many-To-Many映射
//Table指出关联表:Student_Subject
ActiveRecord学习笔记(四):处理Many-To-Many映射
//ColumnKey:指出关联表(Student_Subject)中指向本实体类(Subject)的列名(SubjectID)
ActiveRecord学习笔记(四):处理Many-To-Many映射
//ColumnRef:指出关联表(Student_Subject)中指向另一实体类(Student)的列名(StudentID)
ActiveRecord学习笔记(四):处理Many-To-Many映射
[HasAndBelongsToMany(typeof(Student), Table = "Student_Subject", ColumnRef = "StudentID", ColumnKey = "SubjectID")]
ActiveRecord学习笔记(四):处理Many-To-Many映射
public IList StudentList
}

  除了以上三个必须子属性外,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:
}

  Subject.cs:
}

四、编写调用代码(只列举添加Student对象的程序)
ActiveRecord学习笔记(四):处理Many-To-Many映射private void button1_Click(object sender, EventArgs e)
}

  在保存Student对象objStudent时必须保证objStudent.SubjectList中的Subject对象已存在数据库中,否则是无法保存Student对象的!

相关文章: