simonw代码@痕记

Castle ActiveRecord 泛型应用

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

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

DB结构

Bolg Class

    在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

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

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

posted on 2006-08-11 12:31 simonw 阅读(6453) 评论(5)  编辑 收藏 所属分类: .Net

评论

#1楼  2006-08-11 13:50 robinz-hbifts [未注册用户]

Castle的ActiveRecord最新的版本已支持Generic了啊?

试试从 ActiveRecordBase<Blog> 继承?   回复  引用    

#2楼  2006-08-11 14:26 命运有自己的梦!      

能不能给个完整的例子,这样看不明很明白。   回复  引用  查看    

#3楼  2007-08-02 00:25 细节决定成败,习惯决定未来      

CustomAccess = Generics.Access?
有这样的enum吗?   回复  引用  查看    

#4楼 [楼主] 2007-08-07 15:22 simonw      

写这篇文章的时候是有的, 现在有段时间没有跟进castle了, 不知是否有改变.   回复  引用  查看    

#5楼  2007-08-08 00:30 细节决定成败,习惯决定未来      

原来要自己下一个NH 的generic.dll.
这里有文章专门讲这个.
http://www.ayende.com/projects/nhibernate-query-analyzer/generics.aspx   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
博客园首页

新闻频道

社区

小组

博问

网摘

闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-08-11 13:18 编辑过
成果网帮您增加网站收入


相关链接: