写这篇文章之前,我想先谢谢TerryLee的文章,不是我吹捧他,他的文章写的真的很好,正因为如此,我才对AR产生了很大的兴趣并坚持一直研究下去,我写以下的文章的目的主要是把我在测试AR例子是碰到的一些问题及一些心得拿出来与大家共享.

最近一直在看Castle里的ActiveRecord(以下简称AR),因为之前一直在用WebSharp和IBatisNet,并且总觉得它的灵活性和易操作性不如IBatisNet,比如对多表的操作,复杂查询以及调用存储过程.但对于一些数据关系不是很复杂的项目来说,我觉得AR还是一个不错的选择.

用过NHibernate和IBatisNet的人一定对编写XML的映射文件印象很深刻吧,尽管可以自动生成,但总是会让我感觉很麻烦,而在AR中则不需要那样的影射文件了,它在底层封装了NHibernate的操作,使用特性(Attributes)来代替映射文件,这种简洁的O/R映射正是它吸引我的因素之一.

一、首先我们先来看一下如何构建AR的配置信息,如下:

在Web.Config文件中加入以下节点:

<configSections> <section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord" /> </configSections> <activerecord isWeb="true"> <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="UID=sa;Password=;Initial Catalog=ActiveRecord;Data Source=." /> </config> </activerecord>

用过NHibernate的人肯定对这段配置文件很熟悉,因为AR在底层封装了NHibernate,所以必须有这样的配置信息。isWeb="true"是针对Web项目才要加上的。

配置文件写好之后,我们再来看看如何在代码中初始化,我的做法是在Global.asax.cs 中的 Application_Start 方法中加入如下代码:

protected void Application_Start(Object sender, EventArgs e) { IConfigurationSource source = System.Configuration.ConfigurationSettings.GetConfig("activerecord") as IConfigurationSource; ActiveRecordStarter.Initialize( source,typeof(Company)); }

当然我们实际使用中肯定不是一个实体,这个我也只是用了个笨办法,哪位有更好的方法告诉我一下,先谢了,代码如下:

protected void Application_Start(Object sender, EventArgs e) { IConfigurationSource source = System.Configuration.ConfigurationSettings.GetConfig("activerecord") as IConfigurationSource; Type[] paramTypes = new Type[2]; paramTypes[0] = typeof(Company); paramTypes[1] = typeof(People); ActiveRecordStarter.Initialize( source,paramTypes); }

二、编写AR实体类

1、数据库表

我把我练习时的数据库表结构贴上来,以后我所举的例子也都是围绕这几张表来进行的,如下:

/************************************************************************************ * * Many to Many of ActiveRecord * by pw 2006.05.20 * ************************************************************************************/ --建库 create database ActiveRecord go --1.部门表 create table companies ( id int identity not null, pid int null, cname varchar(50) null, type varchar(20) null, primary key(id) ) go --2.员工表 create table people ( id int identity not null, pname varchar(20) null, primary key(id) ) go --3.部门员工对照表 create table people_companies ( people_id int not null, company_id int not null ) go

实体类代码如下:

using System; using System.Collections; using Castle.ActiveRecord; namespace AR.Model { /// <summary> /// Company 的摘要说明。 /// </summary> [ActiveRecord("companies")] public class Company : Castle.ActiveRecord.ActiveRecordBase { private int _id; private int _pid; private string _cname; private string _type; public Company() { } [PrimaryKey] public int Id { get{return _id;} set{_id = value;} } [Property] public int Pid { get{return _pid;} set{_pid = value;} } [Property] public string Cname { get{return _cname;} set{_cname = value;} } [Property] public string Type { get{return _type;} set{_type = value;} }         public static void DeleteAll() { ActiveRecordBase.DeleteAll(typeof(Company)); } public static Company[] FindAll() { return ((Company[])(ActiveRecordBase.FindAll(typeof(Company)))); } public static Company Find(int id) { return ((Company)(ActiveRecordBase.FindByPrimaryKey(typeof(Company), id))); }
   }
}

当然像这样的实体类的代码是不需要我们一个个的写的,AR提供了自动生成的工具,当然会CodeSmith的人可以自己写一个更方便的。以后我们在配置One to Many 、Many to Many 等关系时需要自己手工修改实体类的代码。

三、单表操作

有了上面的基础,我们现在可以进行一些简单的对数据库的操作了。

1、ADD

public void Add() {    Company company = new Company();    company.Cname = "公司名称";    company.Type = "民营";    company.Create(); }

2、Select

public Company SimpleSelect() {    //查询指定ID的对象    int id = 1;    return Company.Find(1);    //查询所有的Company对象,返回一个Company对象的集合(Company[])    //Company.FindAll(); }

3、Update

public void UpdateCompany() {    //首先得到一个Company对象    Company com = Company.Find(1);    com.Cname = "修改后的信息";    com.Type = "国有";    com.Update(); }

4、Delete

public void Delete() {    //删除指定的对象    int id = 1;    Company.Delete();    //删除所有    Company.DeleteAll(); }

这样以来我们对AR就有了一个初步的认识了,它的操作和NHibernate一样简洁,而且在配置映射关系方面上比其他几种持久层框架要更简便。今天我先说到这,后面的下次再说吧.

我测试的时候没有用NUnit,所有代码都在VS2003下执行过了,应该没问题.

转载于:https://www.cnblogs.com/pw/archive/2006/05/20/405131.html

我的ActiveRecord学习之路(一)相关推荐

  1. Redis学习之路(一)--下载安装redis

    redis学习之路--下载安装redis windows安装redis 1.下载redis 2.安装 3.查看是否安装成功 windows安装redis 1.下载redis 网址:https://gi ...

  2. 前端Vue学习之路(二)-Vue-router路由

    Vue学习之路 (二) Vue-router(基础版) 一.增加静态路由 二.动态路由+路由嵌套+404页面 三. 编程式导航 四.命名路由 五.命名视图 六.重定向和起别名 1.重定向 2.起别名 ...

  3. 前端Vue学习之路(一)-初识Vue

    Vue学习之路 (一) 1.引言 2.更换npm国内镜像源 3.用npm下载Vue 4.Vue全家桶 5.使用命令创建项目 5.推荐插件 6.推荐网站 7.学习扩展 1.引言 先安装node.js环境 ...

  4. 学习之路-现代密码学基础-001

    学习之路-现代密码学基础-第一章密码学概论 转载于:https://www.cnblogs.com/vegetables-Adanos/p/5371420.html

  5. 拿下斯坦福和剑桥双offer,00后的算法学习之路

    董文馨,00后,精通英语,西班牙语.斯坦福大学计算机系和剑桥大学双Offer,秋季将进入斯坦福大学学习. 10岁开始在国外上学:12岁学Scratch: 13岁学HTML & CSS: 14岁 ...

  6. Markdown学习之路

    Markdown学习之路 作者:CFishHome 转载请注明地址:https://blog.51cto.com/12731497/2164274 Markdown是什么? Markdown是一个 W ...

  7. [EntLib]微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇...

    本文是为后面的学习之路做铺垫,简单介绍下企业库中的Validation模块的一些相关知识,包括Validation模块的简介.用途.使用方法.默认提供的多种验证器的介绍等. 一.简介及用途 在实际的项 ...

  8. 转载: Qt 学习之路 2归档

    Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/

  9. python之路 mysql 博客园_教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql...

    教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql Easy_install安装MySQLdb 很简单,以至于我不晓得该怎么说.一句话. sodu ...

最新文章

  1. 【转】PendingIntent的总结
  2. Oracle 12c 多租户 CDB 与 PDB之 shared undo 与 Local undo 切换
  3. Oracle truncate、 delete、 drop区别
  4. OpenXava 4.6.1 发布,Web 快速开发套件
  5. BOOL,int,float,指针变量与零值比较的if语句
  6. MySQL 数据库常用命令
  7. 【ArrayList:键盘录入多个数据,以 0 结束,并在控制台输出最大值】
  8. Ubuntu下安装arm-linux-gcc-4.4.3.tar.gz (交叉编译环境)
  9. linux安装opencv
  10. 苹果开发者账号变更公司名称
  11. MySQL 临时表的原理以及优化手段
  12. fatal error C1083:/fatal error C1010: 错误处理
  13. mysql执行计划explain介绍_MySQL中的执行计划explain详解
  14. 乌班图nginx访问php 变成下载
  15. VS2005向前向后定位图标
  16. JNI 手动释放内存(避免内存泄露)
  17. 深度学习技术在股票交易上的应用研究调查
  18. SpringBoot vue电影购票系统 电影院系统
  19. snowboy个人模型制作
  20. 只要你懂得人性,就不怕没钱赚!

热门文章

  1. 后序遍历二叉树(迭代 vs 递归)
  2. WPF仿微信保存与查看聊天记录
  3. 医学生可以跨专业考计算机的专业,可以跨考医学研究生:2016跨专业考研需谨慎的专业解读:临床医学...
  4. 文件摆渡是什么意思_小白学炒股:除权、填权、贴权是个什么东东?
  5. 2018蓝桥杯A组:分数(3种方法 循环累称 快速幂运算 移位运算)
  6. 数据库安全性概念与自主安全性机制
  7. C++string字符串1.2
  8. jquery系列教程3-DOM操作全解
  9. (三)pscc学习笔记
  10. Python+tkinter实现简单的登录界面