摘要:在ActiveRecord中把数据库表之间的关联关系采用对象间的聚合关系来表现,然而这却带来一系列的性能上的问题。就像我在One-Many中用到的例子Blog,使用Blog.Find(1)查找了一个Blog对象,也许我们只用到它,但事实它却把该Blog所关联的Post对象也读取出来放在了内存中,于是我们就需要有一种方法来实现只在需要Post对象的时候框架再自动读取。另外ActiveRecord只提供了Find(id),FindAll()这样两个静态的查询方法,在我们查询中还远远不够,这方面ActiveRecord为我们提供了HQL语言的支持,同时也可以通过设置Where子句来实现一些简单的查询。

主要内容

1.实现延迟加载

2.使用Where子句

一.实现延迟加载

要实现延迟加载,其实只要在HasMany特性中使用Lazy=true就可以了。来看我们的Blog类是如何声明的:

[ActiveRecord("Blogs")]

public class Blog : ActiveRecordBase

{

    private int _id;

 

    private String _name;

 

    private String _author;

 

    private IList _posts;

 

    [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; }

    }

    

 

    [HasMany(typeof(Post), Table="posts", ColumnKey="post_blogid",Lazy=true)]

    public IList Posts

    {

        get { return _posts; }

        set { _posts = 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 );

    }

}

可以看到唯一与我们前面声明的Blog类不同的地方就在于下面这句话:

[HasMany(typeof(Post), Table="posts", ColumnKey="post_blogid",Lazy=true)]

现在我们来写一个简单的测试代码:

[Test]

public void TestLazyLoad()

{

    //找到Blog对象

    Blog blog = Blog.Find(8);

    string resultName = blog.Name;

 

    //执行这句话的时候才载入Post对象

    int resultCount = blog.Posts.Count;

 

    string expectedName = "Terrylee";

    int expectedCount = 2;

 

    Assert.IsNotNull(blog);

    Assert.AreEqual(expectedName,resultName);

    Assert.AreEqual(expectedCount,resultCount);

}

测试,红灯!?报出了下面的错误:

ARDemo.OneManyFixture.TestLazyLoad : NHibernate.LazyInitializationException : Failed to lazily initialize a collection - no session

问题出在了我们得到Blog对象后,并没有把当前的Session保存下来,ActiveRecord在实现延迟载入时找不到一个NHibernate的ISession。为了保存当前的Session我们必须使用new SessionScope(),重新修改我们的测试代码之后:

[Test]

public void TestLazyLoad()

{

    using(new SessionScope())

    {

        //找到Blog对象

        Blog blog = Blog.Find(8);

        string resultName = blog.Name;

 

        //执行这句话的时候才载入Post对象

        int resultCount = blog.Posts.Count;

 

        string expectedName = "Tech Space";

        int expectedCount = 2;

 

        Assert.IsNotNull(blog);

        Assert.AreEqual(expectedName,resultName);

        Assert.AreEqual(expectedCount,resultCount);

    }   

}

现在测试可以正常通过了,大家在使用延迟载入的时候不要忘了new SessionScope()。

二.使用Where子句

在ActiveRecord中实现稍微复杂的一点的查询,我们就不能用使用Find(id),FindAll()这两个静态的方法了,这时就需要使用HQL语句来实现,这个在后续文章中我会专门用一篇文章来介绍。我们也可以使用ActiveRecord来实现一些简单的查询,个人认为,这种查询把条件写在了特性里面,以一种硬编码的方式来实现,灵活性变得很差,使用的情况不是很多。看一个简单的例子,比如我们要查询某人发表的Category为“Castle”的Posts,可以在Blog实体类中添加一个CastlePosts的特性:

[HasMany(typeof(Post),Table="posts", ColumnKey="post_blogid",Where="post_categories='Castle'")]

public IList CastlePosts

{

    get { return _posts; }

    set { _posts = value; }

}

注意:在Where中写条件时所用的Posts表的字段名,而不是Post实体类对应的属性

编写一个简单的测试代码:

[Test]

public void TestCondWhere()

{

    //找到Blog对象

    Blog blog = Blog.Find(8);

    

    //获取Castle的Posts数量

    int resultCount = blog.CastlePosts.Count;

 

    int expectedCount = 2;

 

    Assert.IsNotNull(blog);

    Assert.AreEqual(expectedCount,resultCount); 

}

这里我们调用CastlePosts得到的就是Category为Castle的Posts。关于延迟加载和使用Where子句就介绍到这儿了。下篇文章介绍如何在RectiveRecord中验证输入数据的有效性。

参考资料

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

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

Castle ActiveRecord学习实践(6):延迟加载和使用Where子句相关推荐

  1. Castle ActiveRecord学习实践(5):实现Many–Many关系的映射

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. ActiveRecord学习(六):总结

    为方便大家学习ActiveRecord,现将有关文章整理如下,希望对大家有多帮助,同时希望AR学习者能多多交流,多谈谈自己学习过程中的体会. 官方网站:http://www.castleproject ...

最新文章

  1. qt windows 静态编译_VS+QT工程配置问题
  2. 内存错误 处理 [CAlayer release]
  3. 新建一个Windows Service的方法
  4. big endian和 little endian
  5. TMS320C6678上电配置和FPGA复位DSP
  6. Material delta download的deletion处理原理
  7. 数组实例的find() 和 findIndex()方法
  8. OpenGL ES Emulator再次横向比较
  9. 海康网络摄像机与电脑交互,有网络和无网络两种方式读取URL视频流,以及无网络情况下配置IP地址
  10. vue使用markdown
  11. centos 中 Discuz 论坛模板配置问题
  12. 如何拆分PDF成多个文件?这样拆分非常简单
  13. 第二篇supervisor集群管理工具cesi安装详解-如何安装supervisor-cesiwebUI
  14. python编程剪刀石头布思路_Python制作简单的剪刀石头布游戏
  15. 吉林大学科研人员新发明让秸秆“变废为宝”
  16. QIIME 2教程. 11元数据Metadata(2021.2)
  17. matlab的imshow, image, imagesc区别
  18. 电子计算机课,《电子计算机》课件3.ppt
  19. 技术至简-5:动画显示复指数信号的形状与物理意义
  20. DEC多国字符集(MCS)-ASCII码对照表、键盘常用ASCII码

热门文章

  1. java构造方法 隐含三步_Java入门总结--------类和对象关系以及构造方法
  2. 【Flink】Flink SQL 一个流 输出 2 次
  3. 【SpringCloud】Spring cloud Alibaba Nacos 服务注册与配置中心
  4. 【lucene】lucene查询操作
  5. java建议:避免使用终结方法
  6. 【Druid IO】Instantiation of [simple type, class druid.indexing.kafka.supervisor.KafkaSupervisorTunin
  7. Drools 7.x Rate算法
  8. 02=windows下安装PostgreSQL(The database cluster initialisation failed)
  9. Android生命周期帮助类,Android Service类与生命周期详细介绍_Android_脚本之家
  10. Elasticsearch 写入优化记录,从3000到8000/s