摘要:多对多的关系在日常开发中也会经常遇到,在
ActiveRecord
中我们用
HasAndBelongsToMany
特性来实现
Many-Many
的关联,本文将通过一个具体的实例来介绍这一用法。
主要内容
1
.准备数据库表
2
.编写实体类
3
.编写测试代码
一.准备数据库表
接着在上篇文章中的例子,为了实现多对多的关系,我们引入
Community
,即每个
Blog
可以属于多个社区,每个社区也可以有多个
Blog
。































二.编写实体类代码
为了实现多对多的关系,我们要在
Blog
、
Community
类中分别使用
HasAndBelongsToMany
特性,不需要编写
Blog_Community
类。示例代码:
的参数相信大家都能够看明白,指定关联表名和关联的外键就可以了。

























































HasAndBelongsToMany
注意:这三个参数必须指定,不可以省略!
HasManyAttribute
说明
属性
|
说明
|
示例
|
Cascade
|
指明哪些操作会从父对象级联到关联的对象,相关的操作见后面,如果不指定,则为None
|
Cascade=ManyRelationCascadeEnum.All
|
Inverse
|
指定是否级联操作
|
Inverse =true|false
|
Schema
|
指定Schema的名字
|
Schema="ARDemo"
|
Table
|
指定持久化类所关联的数据库表名,如果表名与类名相同,可以省略
|
Table="posts"
|
ColumnKey
|
本实体类于另一个实体类关联的外键
|
ColumnKey="community_id"
|
ColumnRef
|
另一实体类的外键
|
ColumnRef="blog_id"
|
Where
|
指定一个附加SQL的Where子句
|
Where="IsPost = 0"
|
Lazy
|
指定是否延迟加载关联对象
|
Lazy=true|false
|
Cascade
的类型值有如下几种
类型
|
说明
|
None
|
不进行级联操作
|
SaveUpdate
|
进行级联Save/Update操作
|
Delete
|
进行级联Delete操作
|
All
|
进行级联Save/Update/Delete操作
|
AllDeleteOrphan
|
进行级联Save/Update/Delete操作,并删除无相关父对象的子对象
|
最后完整的实体类如下:


















































































































































































































































































































三.编写测试代码
下面是我写的一些简单的测试代码,有兴趣的可以看一下。
1
.级联增加:新增一个Blog,让它同时属于好几个社区
.级联更新:对一个已经存在Blog,更改它属于更多的社区



































2













































3
.级联删除:删除一个Blog,级联表中对应的记录应该删除,但Community不能删除,因为还有别的Blog和它关联



















































































好了,关于Many-Many关联映射就写这么多了,内容比较简单。下篇文章我会介绍在ActiveRecord中实现延迟加载和使用Where子句。
参考资料
Castle
的官方网站http://www.castleproject.org