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
主要内容[/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
相关文章推荐
- Castle ActiveRecord学习实践(4):实现One-Many关系的映射
- Castle ActiveRecord学习实践(4):实现One-Many关系的映射
- C#.Net Castle ActiveRecord学习实践(4):实现One-Many关系的映射
- Castle ActiveRecord学习实践(5):实现Many–Many关系的映射
- C#.Net Castle ActiveRecord学习实践(5):实现Many–Many关系的映射
- Castle ActiveRecord学习实践(4):实现One-Many关系的映射
- Castle ActiveRecord学习实践(5):实现Many–Many关系的映射
- Castle ActiveRecord学习实践(5):实现Many–Many关系的映射
- C#.Net Castle ActiveRecord学习实践(3):映射基础
- Castle ActiveRecord学习实践(11)——ActiveRecordMediator
- Castle ActiveRecord学习实践(8):数据有效性的验证
- C#.Net Castle ActiveRecord学习实践(7):使用HQL查询
- Castle ActiveRecord学习实践(6):延迟加载和使用Where子句
- C#.Net Castle ActiveRecord学习实践(1):快速入门指南
- C#.Net Castle ActiveRecord学习实践(8):数据有效性的验证
- Castle ActiveRecord学习实践(6):延迟加载和使用Where子句
- Castle ActiveRecord学习实践(7):使用HQL查询
- Castle ActiveRecord学习实践(5)继承
- C#.Net Castle ActiveRecord学习实践(2):构建配置信息
- C#.Net Castle ActiveRecord学习实践(9):使用ActiveRecord的一些技巧