Castle ActiveRecord 泛型应用
Castle ActiveRecord在.Net2.0下支持泛型,这极大的方便了我们创建强类型集合以及对对象的强类型操作.本文引用了Castle站点上泛型的例子来详细介绍如何应用泛型. 另外你需要在这里找到NHibernate.Generics 来支持AR对泛型的扩展.这个例子描述了最简单的Blog与Post一对多的关系,为了让示例更清晰,做了少许修改.
NHibernate.Generics 中包含了若干供我们引用的泛型集合EntitySet,EntityList,EntityDictionary等,以及与这些集合相匹配的EntityRef.
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]
[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中省去了麻烦的转型.
[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 泛型应用相关推荐
- Castle.ActiveRecord的ProxyFactory配置
前后差不多两年没使用过Castle.ActiveRecord做ORM了,也近两年没有关注Castle的版本变化了,最近关注了发现很多地方都改变了.今天在一个现有的小项目中尝试添加Castle.Acti ...
- Castle ActiveRecord(一)概述
一.ActiveRecord与Castle ActiveRecord ActiveRecord是<Patterns of Enterprise Application Architecture& ...
- Castle.ActiveRecord的嵌套事务处理
嵌套的情况下,怎么处理Castle.ActiveRecord的事务? 今天试了一下,原来还是很简单的,只需要使用Castle.ActiveRecord.TransactionMode.Inherits ...
- Castle ActiveRecord学习实践(1):快速入门指南
摘要:最近几天有时间看了一下Castle,原来它的功能是如此的强大,从数据访问框架到IOC容器,再到WEB框架,基本包括了整个开发过程中的所有东西,看来得好好学习研究一下了,并且打算把自己学习过程的一 ...
- 使用 Castle ActiveRecord
使用 Castle ActiveRecord: 由 database (测试于SQL 2005) 直接使用 AR 的 Generator 产生 mapping class (C#/BV.Net) 法: ...
- castle activerecord mysql_Castle ActiveRecord配置中需要注意的地方
关于Castle 的开发可参考李会军老师的Castle 开发系列文章,里面有关于ActiveRecord学习实践系列和Castle IOC容器系列两个部分,是比较好的教程. 这里主要说明在Castle ...
- Castle ActiveRecord学习实践(2):构建配置信息
摘要:ActiveRecord在底层封装了NHibernate,在框架启动时需要指定相关的配置信息,那么我们需要配置些什么?又该如何去配置呢?本文将会介绍在ActiveRecord中构建配置信息. 主 ...
- Castle.ActiveRecord 学与练[3]
Castle.ActiveRecord引入了特性映射这个概念,使用Attribute来代替.hbm.xml文件,从而更加清晰的呈现出了实体类跟数据库表之间的关系,使持久化的数据操作更加简单,易用. ...
- Castle ActiveRecord学习实践(8)HQL查询
本篇来了解下Castle ActiveRecord hql 查询语句. 博客园中讲解Castle ActiveRecord 的文章已经很多了,博主就不自己写了.转载一篇TerryLee大大的文章. 摘 ...
最新文章
- 在线作图|你不知道的绘制带聚类树的堆叠柱状图的方法
- scikit-learn朴素贝叶斯各种用法总结真正讲明白的,为作者建平点赞
- 【Hibernate步步为营】--关联映射之多对一
- linux 命令/目录 名称 英文单词 缩写 助记
- STM32+CubeMX开发工程笔记汇总(更新2021.8.12)
- CSS3中display属性的Flex布局
- Unity接入百度语音识别WebAPI
- QuickWAP实现网页跳转
- ipv6单播地址包括哪两种类型_IPv6基础介绍
- 创维E900V21E机顶盒刷机固件 解决:不用设置有线自动连网
- java开发的程序怎么用_java安装后怎么使用?第一次编写java程序
- StuQ IT技能图谱全集
- 用户体验与可用性测试_读书笔记
- CRM系统实现企业管理高效协同
- 离散求边缘密度_求一把能退烧的机械键盘?——机械键盘购买“指北”
- poi解析excel(处理单元格公式)
- 1T空间只是噱头而已! 网盘容量大战背后的技术秘密
- IEEE access投稿详细步骤
- PMP——第4章 项目整合管理
- java.sql.SQLException: 无效的列类型: 1111 报错问题解决