Castle ActiveRecord在.Net2.0下支持泛型,这极大的方便了我们创建强类型集合以及对对象的强类型操作.本文引用了Castle站点上泛型的例子来详细介绍如何应用泛型. 另外你需要在这里找到NHibernate.Generics 来支持AR对泛型的扩展.这个例子描述了最简单的Blog与Post一对多的关系,为了让示例更清晰,做了少许修改.

NHibernate.Generics 中包含了若干供我们引用的泛型集合EntitySet,EntityList,EntityDictionary等,以及与这些集合相匹配的EntityRef.

DB结构
CREATE TABLE [dbo].[Blogs] (
    [blog_id] [int] IDENTITY (1, 1) NOT NULL ,
    [blog_name] [varchar] (50) NULL ,    
) ON [PRIMARY]

CREATE TABLE [dbo].[Posts] (
    [post_id] [int] IDENTITY (1, 1) NOT NULL ,
    [post_title] [varchar] (50) NULL ,
    [post_contents] [text] NULL ,    
    [post_blogid] [int] NULL ,    
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Bolg Class
[ActiveRecord]
public class Blog : ActiveRecordBase
{
    EntitySet<Post> _posts;
    int _id;
    string _name;

    private Blog()
    {
        _posts = new EntitySet<Post>(
                delegate(Post p) { p.Blog = this; },
                delegate(Post p) { p.Blog = null; }
            );
    }

    [PrimaryKey(PrimaryKeyType.Identity, "blog_id", Access = PropertyAccess.NoSetterCamelCaseUnderscore)]
    public int Id
    {
        get { return _id; }
    }

    [Property("blog_name")]
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    [HasMany(typeof(Post), "post_blogId", "Posts", Inverse = true, 
        CustomAccess = Generics.Access, RelationType = RelationType.Set)]
    public ICollection<Post> Posts
    {
        get { return _posts; }
    }

    public static Blog FindByName(string value)
    {
        return ActiveRecordBase<Blog>.FindOne(new EqExpression("Name", value));
    }
}

在BlogClass中看到了这样的定义EntitySet<Post> _posts.

首先看看构造函数中对它的初始化2个匿名delegate的作用是当向Bolg.Posts集合中添加或移除一个Post时,自动添加或移除Post.Bolg属性设置.省却了每次都需要做双向设置.

再来看一下Bolg.Posts的公开属性返回一个ICollection的接口是很重要的而不是具体类型,这样屏蔽了直接使用NHibernate.Generics中的集合所带来的依赖.

最后看看顶上的attribute,对应关系不多讲,CustomAccess = Generics.Access是一定要标明的描述了泛型访问方式.RelationType = RelationType.Set同样要标识明确RelationType.Set对应EntitySet, RelationType.Bag则对应EntityList.Inverse属性有可无了,它指明了即使Bolg.Posts中的Post没有被存入数据库Bolg一样可以被先保存,通常我认为使用Cascade = ManyRelationCascadeEnum.All会更好.

还有一点需要注意的是应用了泛型的私有变量命名如 _posts,按照AR目前最新的DailyBulid你必须按照下划线这样的格式命名,Access属性的设置似乎是无效的.如果使用其他方式会出错.

泛型集合之后来关注下其他问题.

你看到了Id的attribute,由于id是自动生成的所以无需设置set访问器,Access = PropertyAccess.NoSetterCamelCaseUnderscore会帮你赋值NoSetterCamelCaseUnderscore指出Id属性的私有变量命名方式是无set访问器的以下划线开头的Camel命名方式.

对对象的数据库操作同样可以使用泛型,可以看到FindByName中省去了麻烦的转型.

Post Class
[ActiveRecord]
public class Post : ActiveRecordBase
{
    int _id;
    string _title;
    string _content;

    EntityRef<Blog> _blog;

    [PrimaryKey(PrimaryKeyType.Identity, "post_id",
        Access = PropertyAccess.NoSetterCamelCaseUnderscore)]
    public int Id
    {
        get { return _id; }
    }

    [Property("post_title")]
    public string Title
    {
        get { return _title; }
        set { _title = value; }
    }

    [Property("post_content")]
    public string Content
    {
        get { return _content; }
        set { _content = value; }
    }

    [BelongsTo("post_blog_id",
        CustomAccess = Generics.Access)]
    public Blog Blog
    {
        get { return _blog.Value; }
        set { _blog.Value = value; }
    }

    public Post()
    {
        _blog = new EntityRef<Blog>(
                delegate(Tests.Blog b) { b.Posts.Add(this); },
                delegate(Tests.Blog b) { b.Posts.Remove(this); }
            );
    }
}

在PostClass中EntityRef是一个对对象的包装,使得它能够添加delegate与Entityxx集合对应来处理添加或移除的同步操作.在Post.Blog属性中可以通过_blog.Value来访问与设置EntityRef包装的值.attribute并没有特别支处,只是CustomAccess = Generics.Access也是不可缺少的属性.

现在你可以使用ActiveRecord轻松编程了.

Castle ActiveRecord 泛型应用相关推荐

  1. Castle.ActiveRecord的ProxyFactory配置

    前后差不多两年没使用过Castle.ActiveRecord做ORM了,也近两年没有关注Castle的版本变化了,最近关注了发现很多地方都改变了.今天在一个现有的小项目中尝试添加Castle.Acti ...

  2. Castle ActiveRecord(一)概述

    一.ActiveRecord与Castle ActiveRecord ActiveRecord是<Patterns of Enterprise Application Architecture& ...

  3. Castle.ActiveRecord的嵌套事务处理

    嵌套的情况下,怎么处理Castle.ActiveRecord的事务? 今天试了一下,原来还是很简单的,只需要使用Castle.ActiveRecord.TransactionMode.Inherits ...

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

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

  5. 使用 Castle ActiveRecord

    使用 Castle ActiveRecord: 由 database (测试于SQL 2005) 直接使用 AR 的 Generator 产生 mapping class (C#/BV.Net) 法: ...

  6. castle activerecord mysql_Castle ActiveRecord配置中需要注意的地方

    关于Castle 的开发可参考李会军老师的Castle 开发系列文章,里面有关于ActiveRecord学习实践系列和Castle IOC容器系列两个部分,是比较好的教程. 这里主要说明在Castle ...

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

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

  8. Castle.ActiveRecord 学与练[3]

    Castle.ActiveRecord引入了特性映射这个概念,使用Attribute来代替.hbm.xml文件,从而更加清晰的呈现出了实体类跟数据库表之间的关系,使持久化的数据操作更加简单,易用.   ...

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

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

最新文章

  1. 在线作图|你不知道的绘制带聚类树的堆叠柱状图的方法
  2. scikit-learn朴素贝叶斯各种用法总结真正讲明白的,为作者建平点赞
  3. 【Hibernate步步为营】--关联映射之多对一
  4. linux 命令/目录 名称 英文单词 缩写 助记
  5. STM32+CubeMX开发工程笔记汇总(更新2021.8.12)
  6. CSS3中display属性的Flex布局
  7. Unity接入百度语音识别WebAPI
  8. QuickWAP实现网页跳转
  9. ipv6单播地址包括哪两种类型_IPv6基础介绍
  10. 创维E900V21E机顶盒刷机固件 解决:不用设置有线自动连网
  11. java开发的程序怎么用_java安装后怎么使用?第一次编写java程序
  12. StuQ IT技能图谱全集
  13. 用户体验与可用性测试_读书笔记
  14. CRM系统实现企业管理高效协同
  15. 离散求边缘密度_求一把能退烧的机械键盘?——机械键盘购买“指北”
  16. poi解析excel(处理单元格公式)
  17. 1T空间只是噱头而已! 网盘容量大战背后的技术秘密
  18. IEEE access投稿详细步骤
  19. PMP——第4章 项目整合管理
  20. java.sql.SQLException: 无效的列类型: 1111 报错问题解决

热门文章

  1. 畅捷通携手易后台,专注小微企业财税服务
  2. 在SQL Server中如何获得刚插入一条新记录的自动ID号
  3. copy一下面试题目
  4. Linux网络性能评估工具iperf
  5. objective-C NSNotificationCenter (通知)的使用方法
  6. VS2010 SP1 Beta与VisualSVN的冲突引起VS2010关闭时重启
  7. 理解 Delphi 的类(六) - 认识类的封装
  8. 交叉表的简单实现2:使用前端程序实现
  9. winrunner事务概念的代码应用(毫秒级)
  10. Redis缓存数据库安全加固指导(一)