您的位置:首页 > 其它

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

2006-04-06 16:28 597 查看
摘要:前面几篇文章简单的介绍了ActiveRecord中的基本映射以及构建配置信息,本文我们用ActiveRecord里面的Blog,Post例子来实现One-Many/Many-One关联。

主要内容[/b]

1.准备数据表结构

2.编写实体类并介绍HasMany和BlongsTo特性

3.构建配置信息

4.编写测试代码

一.准备数据表结构[/b]

在这个例子中,我们引入了两个对象Blog、Post,它们之间的关系是一对多,即一个Blog有多篇Post。需要用到的数据表结构如下

CREATE TABLE Blogs (

blog_id int IDENTITY(1, 1) PRIMARY KEY,

blog_name varchar(50),

blog_author varchar(50)

)

CREATE TABLE Posts (

post_id int IDENTITY(1, 1) PRIMARY KEY,

post_title varchar(50),

post_contents text,

post_categories varchar(50),

post_blogid int FOREIGN KEY REFERENCES Blogs (blog_id),

post_created datetime,

post_published bit

)

二.编写实体类[/b]

首先我们来看Blog实体类的编写,需要用到HasMany特性,这时我们会在Blog实体类中定义一个Posts属性,用它来表示该Blog所发表的所有Posts,代码如下

[ActiveRecord("Blogs")]

public class Blog : ActiveRecordBase

[ActiveRecord("Posts")]

public class Post : ActiveRecordBase

[ActiveRecord("Blogs")]

public class Blog : ActiveRecordBase

[ActiveRecord("Posts")]

public class Post : ActiveRecordBase

<?xml version="1.0" encoding="utf-8" ?>

<activerecord>

<config>

<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />

<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" />

<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />

<add key="hibernate.connection.connection_string" value="Data Source=.;Initial Catalog=test;Integrated Security=SSPI" />

</config>

</activerecord>

四.编写测试代码[/b]

1.级联增加:新增一个Blog,并同时添加相关的Post到数据表中

[Test]

public void TestCascadingSave()

[Test]

public void TestCascadingUpdate()

[Test]

public void TestCascadingUpdate()

[Test]

public void TestCascadingUpdate()

//
[HasMany(typeof(Post), Table="posts", ColumnKey="post_blogid",Cascade=ManyRelationCascadeEnum.SaveUpdate)]

public IList Posts

[Test]

public void TestCascadingUpdateDel()

//
[HasMany(typeof(Post), Table="posts", ColumnKey="post_blogid",Cascade=ManyRelationCascadeEnum.AllDeleteOrphan)]

public IList Posts

[Test]

public void TestCascadingDelete()


{




//找到ID为7的Blog对象




Blog blog = Blog.Find(5);








using(TransactionScope tran = new TransactionScope())








{




try








{




blog.Delete();








tran.VoteCommit();




}




catch








{




tran.VoteRollBack();




}




}




}

同样要注意设置级联操作。

关于One-Many关联映射就介绍这么多了,至于Many-One关联同One-Many,只不过对HasMany和BlongsTo设置的位置不一样而已,在下一篇文章中我会介绍在ActiveRecord中实现Many-Many关联映射。

参考资料[/b]

Castle的官方网站http://www.castleproject.org
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: