摘要:多对多的关系在日常开发中也会经常遇到,在ActiveRecord中我们用HasAndBelongsToMany特性来实现Many-Many的关联,本文将通过一个具体的实例来介绍这一用法。

主要内容

1.准备数据库表

2.编写实体类

3.编写测试代码

一.准备数据库表

接着在上篇文章中的例子,为了实现多对多的关系,我们引入Community,即每个Blog可以属于多个社区,每个社区也可以有多个Blog。

CREATE TABLE Blogs (

    blog_id     int IDENTITY(1, 1) PRIMARY KEY,

    blog_name   varchar(50),

    blog_author varchar(50)

)

 

CREATE TABLE Blog_Community (

     blog_Id int NOT NULL ,

     community_Id int NOT NULL 

 )

 

 CREATE TABLE Communities (

     community_Id int IDENTITY (1, 1) PRIMARY KEY,

     community_Name varchar (50) ,

     community_Intro varchar (500) 

 )

二.编写实体类代码

为了实现多对多的关系,我们要在Blog、Community类中分别使用HasAndBelongsToMany特性,不需要编写Blog_Community类。示例代码:

// Blog

[HasAndBelongsToMany( typeof(Community), 

        Table="Blog_Community", 

        ColumnRef=" community_id ", 

        ColumnKey=" blog_id " )]

public IList Communitys

{

    get { return _community; }

    set { _ community = value; }

}

 

// Community

[HasAndBelongsToMany( typeof(Blog), 

        Table="Blog_Community", 

        ColumnRef="blog_id", 

        ColumnKey="community_id" )]

public IList Blogs

{

    get { return _blog; }

    set { _ blog = value; }

}

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操作,并删除无相关父对象的子对象

最后完整的实体类如下:

/**//// <summary>

/// Blog 的摘要说明。

/// </summary>

[ActiveRecord("Blogs")]

public class Blog : ActiveRecordBase

{

    private int _id;

 

    private String _name;

 

    private String _author;

 

    private IList _community;

 

    [PrimaryKey(PrimaryKeyType.Identity, "blog_id")]

    public int Id

    {

        get { return _id; }

        set { _id = value; }

    }

 

    [Property("blog_name")]

    public String Name

    {

        get { return _name; }

        set { _name = value; }

    }

 

    [Property("blog_author")]

    public String Author

    {

        get { return _author; }

        set { _author = value; }

    }

    

    [HasAndBelongsToMany(typeof(Community),

            Table="Blog_Community",

            ColumnRef=" community_id ",

            ColumnKey=" blog_id " )]

    public IList Communities

    {

        get { return _community; }

        set { _community = value; }

    }

 

 

    public static void DeleteAll()

    {

        DeleteAll( typeof(Blog) );

    }

 

    public static Blog[] FindAll()

    {

        return (Blog[]) FindAll( typeof(Blog) );

    }

 

    public static Blog Find(int id)

    {

        return (Blog) FindByPrimaryKey( typeof(Blog), id );

    }

}
/**//// <summary>

/// Community 的摘要说明。

/// </summary>

[ActiveRecord("Communities")]

public class Community : ActiveRecordBase

{

    private int _id;

 

    private String _name;

 

    private String _intro;

 

    private IList _blog;

 

    [PrimaryKey(PrimaryKeyType.Identity, "Community_Id")]

    public int Id

    {

        get { return _id; }

        set { _id = value; }

    }

 

    [Property("Community_Name")]

    public String Name

    {

        get { return _name; }

        set { _name = value; }

    }

 

    [Property("Community_Intro")]

    public String Author

    {

        get { return _intro; }

        set { _intro = value; }

    }

    

    [HasAndBelongsToMany(typeof(Blog),

            Table="Blog_Community",

            ColumnRef="blog_id",

            ColumnKey="community_id" )]

    public IList Blogs

    {

        get { return _blog; }

        set { _blog = value; }

    }

 

    public static void DeleteAll()

    {

        DeleteAll( typeof(Community) );

    }

 

    public static Community[] FindAll()

    {

        return (Community[]) FindAll( typeof(Community) );

    }

 

    public static Community Find(int id)

    {

        return (Community) FindByPrimaryKey( typeof(Community), id );

    }

}

三.编写测试代码

下面是我写的一些简单的测试代码,有兴趣的可以看一下。

1.级联增加:新增一个Blog,让它同时属于好几个社区

[Test]

public void TestCascadingSave()

{

    //新建一个Blog

    Blog blog = new Blog();

    blog.Name = "Tech Space";

    blog.Author = "Terrylee";

    

    //属于ID为1,2社区

    ArrayList list = new ArrayList();

    list.Add(Community.Find(1));

    list.Add(Community.Find(2));

    blog.Communities = list;

    

    //保存

    blog.Save();

}

2.级联更新:对一个已经存在Blog,更改它属于更多的社区

[Test]

public void TestCascadingUpdate()

{

    //测试1:查找一个Blog

    Blog blog = Blog.Find(10);

 

    IList clist = blog.Communities;

 

    clist.Add(Community.Find(4));

    clist.Add(Community.Find(3));

 

    blog.Save();

 

    //测试2:查找一个Community

    Community community = Community.Find(3);

 

    IList blist = community.Blogs;

 

    blist.Add(Blog.Find(8));

 

    community.Save();

}

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

[Test]

public void TestCascadingDelete()

{

    //测试1:删除Blog

    Blog blog = Blog.Find(10);

    

    using(TransactionScope btran = new TransactionScope())

    {

        try

        {

            blog.Delete();

            btran.VoteCommit();

        }

        catch

        {

            btran.VoteRollBack();

        }

    }

 

    //测试2:删除Community

    Community community = Community.Find(3);

 

    using(TransactionScope ctran = new TransactionScope())

    {

        try

        {

            community.Delete();

            ctran.VoteCommit();

        }

        catch

        {

            ctran.VoteRollBack();

        }

    }

}

好了,关于Many-Many关联映射就写这么多了,内容比较简单。下篇文章我会介绍在ActiveRecord中实现延迟加载和使用Where子句。

参考资料

Castle的官方网站http://www.castleproject.org

转载于:https://www.cnblogs.com/Terrylee/archive/2006/04/10/370950.html

Castle ActiveRecord学习实践(5):实现Many–Many关系的映射相关推荐

  1. Castle ActiveRecord学习实践(1):快速入门指南

    摘要:最近几天有时间看了一下Castle,原来它的功能是如此的强大,从数据访问框架到IOC容器,再到WEB框架,基本包括了整个开发过程中的所有东西,看来得好好学习研究一下了,并且打算把自己学习过程的一 ...

  2. Castle ActiveRecord学习实践(2):构建配置信息

    摘要:ActiveRecord在底层封装了NHibernate,在框架启动时需要指定相关的配置信息,那么我们需要配置些什么?又该如何去配置呢?本文将会介绍在ActiveRecord中构建配置信息. 主 ...

  3. Castle ActiveRecord学习实践(8)HQL查询

    本篇来了解下Castle ActiveRecord hql 查询语句. 博客园中讲解Castle ActiveRecord 的文章已经很多了,博主就不自己写了.转载一篇TerryLee大大的文章. 摘 ...

  4. Castle ActiveRecord学习实践(4):实现One-Many关系的映射

    摘要:前面几篇文章简单的介绍了ActiveRecord中的基本映射以及构建配置信息,本文我们用ActiveRecord里面的Blog,Post例子来实现One-Many/Many-One关联. 主要内 ...

  5. Castle ActiveRecord学习实践(6):延迟加载和使用Where子句

    摘要:在ActiveRecord中把数据库表之间的关联关系采用对象间的聚合关系来表现,然而这却带来一系列的性能上的问题.就像我在One-Many中用到的例子Blog,使用Blog.Find(1)查找了 ...

  6. Castle ActiveRecord学习实践(7):使用HQL查询

    摘要:虽然ActiveRecord为我们提供了Find()和FindAll()这样两个静态的查询方法,并且有Where特性可供使用,但是仍然不能解决实际开发中一些复杂的查询,这时我们就需要通过HQL查 ...

  7. ActiveRecord学习笔记(四):处理Many-To-Many映射

    本文主要描述了如何使用Castle.ActiveRecord处理Many-To-Many映射.本文主要涉及了两个类:Student(学生).Subject(学科),这两个类的关系是多对多的,因为一个学 ...

  8. Castle ActiveRecord学习笔记四:各种映射

    这里主要来说明ActiveRecord的属性与数据库及其字段的对应关系. 主要以ActiveRecordAttribute.PrimaryKeyAttribute.PropertyAttribute来 ...

  9. Castle ActiveRecord学习(四)延迟加载、分页查询、where条件

    一.延迟加载 //用户发布的主题,一对多:Table:外键表:ColumnKey:外键:Lazy:延迟加载:Cascade:级联操作(级联删除)[HasMany(typeof(ThemeInfo), ...

最新文章

  1. BCRAN课本命令回顾
  2. python读取大文件内容_Python模块linecache处理大文件
  3. osg动态加载模型不显示_OSG仿真案例(8)——读取FBX格式文件并显示(无动画)...
  4. 30万手表推荐_一年收入20万—30万的小生意,市场上有哪些呢?推荐几个供参考...
  5. TagSL框架设计(1)----先来点简介
  6. 脚本重启项目-定时启动
  7. LOJ#6070. 「2017 山东一轮集训 Day4」基因 解题报告
  8. excel自动求和_excel自动求和你会吗?更改姓名自动算出总分,三个函数轻松搞定...
  9. 中国科学院微生物研究所微生物资源与大数据中心招聘启事
  10. 互联网下半场的基本玩法
  11. mac升级mysql_Mac如何升级Mysql数据库 Mac升级Mysql数据库步骤
  12. 篮球图片html页面代码,教你用PS制作一个非常逼真的篮球图片
  13. 你以为的SPSS只是简单的数据分析软件吗?
  14. 将数字上调至8的倍数
  15. 多态、虚函数举例(人与复读机)
  16. Mxnet训练自己的数据集并测试
  17. Rancher docker集群
  18. git 删除本地分支
  19. 今天收到的QQ礼品卡,差点上当……
  20. 边缘计算如何推动物联网的发展

热门文章

  1. Android 6.0 运行时权限处理完全解析
  2. Port already be taken
  3. WWDC上这个神级功能,一言不合又要改变未来购物趋势
  4. C# MVC中返回JSON 对象
  5. Jquery通过Ajax方式来提交Form表单
  6. tnsnames.ora和listener.ora文件中的几个概念
  7. idea 使用 git 教程
  8. 威胁预警|多个挖矿僵尸网络开始使用ThinkPHP v5漏洞 威胁升级
  9. yum报错Error: Cannot retrieve repository metadata (repomd.xml) for repository: rhel-source
  10. Rift.io基于OSM发布首个商用MANO软件