一、Active Record(活动记录)模式

  Active Record是业务逻辑层中(《企业应用架构模式》将该模式归为数据源模式)常用的一种框架模式,尤其在底层数据库模型匹配业务模型时它特别有用,它是一种以数据库驱动为主的框架模式。

  通常,数据库中的每张表都对应一个业务对象。业务对象表示表中的一行,并且包含数据、行为以及持久化该对象的工具,此外还有添加新实例和查找对象集合所需的方法。

  在Active Record模式中,每个业务对象均负责自己的持久化和相关的业务逻辑。

  Active Record模式非常适用于在数据模型与业务模型之间具有 一对一映射关系的简单应用程序,如博客或论坛。

  因为业务对象与数据库中的表具有一对一映射关系,而且均具有相同的CRUD方法,所以可以使用代码生成器自动生成业务模型。

  Active Record模式中的对象通常会包含用来执行数据库操作的CRUD操作,还有相关验证及业务相关的计算和检查功能。

  特别地,典型的Active Record类还包含一些表示数据表中的列的实例属性和操作于当前对象上的实例方法。Active Record类中还可能包含一些静态方法,用来操作数据表上的所有记录。(下面的实战操作可能会很好的帮助你理解这句话)

  1.Active Record的优势

  Active Record的成功依赖于两个因素:简单和框架。Active Record概念上理解起来十分的简单, 不过若手工实现,仍然需要很多代码。

  编写并维护每一个类都需要大量的代码,不过这仅仅是最低的需求,因为你可能还要考虑为每个类或者数据表添加一个或多个数据迁移对象(DTO)。

  不可否认,活动记录确实在简单和最终系统的强大方面找到了良好的平衡。且该模式也等到了很多开发商的支持,例如,LINQ-to-SQL和我们今天的主角--Castle ActiveRecord

  2.Active Record的劣势

  理论上,开发中还需要一个额外的层存在于对象模型和数据模式之间,通常叫做数据映射层(Data Mapper)。在Active Record中,我们可以将该层直接集成在对象中,不过随着这一层越来越复杂,维护成本也在逐渐提高。

  Active Record的另外一个问题是对象和数据表设计之间的绑定。若你不得不修改数据库,那么要同时修改Active Record的对象模型以及所有的相关代码。

  3.Active Record与表模式的区别

  表模式通常就是目前三层框架中流行的以DateTable和DateSet为载体在各层中传递数据,Active Record则是以对象模型、泛型(如IList<Post>)为载体在各层中传递数据。

二、Castle ActiveRecord介绍

  Castle ActiveRecord 是ActiveRecord 模式的一个实现,Castle ActiveRecord依赖Nhibernate来完成实际的映像。与单纯的ActiveRecord 相比,Castle ActiveRecord具有以下特点:

  •  敏捷开发(它尽可能多地处理了映射和推断,因此,对你的方案而言,当一些东西发生变化的时候,你不必去钻研文档或者处理大量的xml文档)
  • 预定了像Create, Update, Save, Delete这样的公共方法。
  • 容易实现像Find, FindAll, FindByName等此类的方法。
  • 绘画和事务范围(Session and transaction scopes that abstracts the ISession and translates them to a more natural idiom )

  使用Nhibernate,你繁琐的配置工作多于复杂的映射,而使用ActiveRecord却是推进你的生产力的一个保证,你不必再为编写繁冗复杂的映射文件而头疼,ActiveRecord封装了NHibernate的操作,使用特性来代替映射文件,无论何时你需要,ActiveRecord都能给你一个Isession实例,它提供的简洁的O/R映射会让你为实现持久化数据层是那么简单而惊叹!

  官方网址:http://www.castleproject.org/

三、Castle ActiveRecord入门实战

  环境:Windows 8.1+Visual Stidio 2013+Sql Server 2008R2+.Net Framework 4.0

  版本:Castle.ActiveRecord-3.0.RC

  相关下载:SDK下载 源码下载

  数据库:ActiveRecord_Blog

  数据表:Post

USE [ActiveRecord_Blog]
GO /****** Object: Table [dbo].[Post] Script Date: 11/08/2014 11:12:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[Post](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Subject] [nvarchar](64) NULL,
[Text] [nvarchar](1024) NULL,
[DateAdded] [datetime] NULL,
CONSTRAINT [PK_Posts] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO

  数据表:Comment

USE [ActiveRecord_Blog]
GO /****** Object: Table [dbo].[Comment] Script Date: 11/08/2014 11:11:22 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[Comment](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Text] [nvarchar](1024) NULL,
[Author] [nvarchar](64) NULL,
[DateAdded] [datetime] NULL,
[PostId] [int] NULL,
CONSTRAINT [PK_Comment] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO ALTER TABLE [dbo].[Comment] WITH CHECK ADD CONSTRAINT [FK_Comment_Post] FOREIGN KEY([PostId])
REFERENCES [dbo].[Post] ([Id])
GO ALTER TABLE [dbo].[Comment] CHECK CONSTRAINT [FK_Comment_Post]
GO

  如图:

  

  项目目录:

  

  Model-->Castle.ActiveRecord.dll、NHibernate.dll

  Web-->Model、Castle.ActiveRecord-3.0.RC中的所有DLL

  Model中:

  Post类:

    // 指定数据表
[ActiveRecord("Post")]
public class Post : ActiveRecordBase<Post>
{
// 指定数据表中的主键
[PrimaryKey(PrimaryKeyType.Identity, "Id")]
public int Id { get; set; } // 指定数据表中的列
[Property("Subject")]
public string Subject { get; set; } [Property("Text")]
public string Text
{
get;
set;
} [Property("DateAdded")]
public DateTime DateAdded { get; set; } //一对多
[HasMany(typeof(Comment), Table = "Comment", ColumnKey = "PostId")]
public IList<Comment> Comments { get; set; } // 静态方法,通过主键ID查找
public static Post Find(int id)
{
return FindByPrimaryKey(id);
}
}

  Comment类:

    [ActiveRecord("Comment")]
public class Comment : ActiveRecordBase<Comment>
{
[PrimaryKey("Id")]
public int Id { get; set; } [Property("Author")]
public string Author { get; set; } [Property("Text")]
public string Text { get; set; } [Property("DateAdded")]
public DateTime DateAdded { get; set; } [Property("PostId")]
public int PostId { get; set; }
// 多对一,对应Post的的Comments属性
[BelongsTo(Column = "PostId")]
public Post Post { get; set; }
}

  Web中:

  NHibernate.config配置文件:

<?xml version="1.0" encoding="utf-8"?>
<activerecord isWeb="true">
<config>
<add
key="connection.driver_class"
value="NHibernate.Driver.SqlClientDriver" />
<add
key="dialect"
value="NHibernate.Dialect.MsSql2005Dialect" />
<add
key="connection.connection_string"
value="UID=sa;Password=123456;Initial Catalog=ActiveRecord_Blog;Data Source=." />
<add
key="connection.provider"
value="NHibernate.Connection.DriverConnectionProvider" />
<add
key="proxyfactory.factory_class"
value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" />
</config>
</activerecord>

  Global.asax:加载配置文件

        void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
AuthConfig.RegisterOpenAuth();
RouteConfig.RegisterRoutes(RouteTable.Routes);
InitActiveRecord();
} private void InitActiveRecord()
{
try
{
string NHibernateFilePath = Server.MapPath("~/NHibernate.config");
XmlConfigurationSource source = new XmlConfigurationSource(NHibernateFilePath);
ActiveRecordStarter.Initialize(source, typeof(Model.Post), typeof(Model.Comment));
}
catch (Exception)
{ throw;
} }

  Default.aspx:测试

  Add操作:

public void Add()
{
Model.Post post = new Model.Post()
{
Subject = "测试2",
Text = "测试内容2",
DateAdded = DateTime.Now
};
post.Create();
}

  Update操作:

public void Update()
{
Model.Post post = new Model.Post();
post = Model.Post.Find();
post.Subject = "修改后1";
post.Text = "修改后内容1";
post.Update();
}

  Delete操作:

public void Delete(int id)
{
Model.Post post = new Model.Post();
post.Id = ;
post.Delete();
Response.Write("删除了ID:" + id + "\n\r");
} public void DeleteAll()
{
Model.Post.DeleteAll();
}

  Find操作:

public void Find(int id)
{
using (new SessionScope())
{
Model.Post post = new Model.Post();
post = Model.Post.Find(id);
Response.Write(post.Id.ToString() + "\n\r");
Response.Write(post.Subject + "\n\r");
Response.Write(post.Text + "\n\r");
Response.Write(post.DateAdded.ToString() + "\n\r");
Response.Write(post.Comments.FirstOrDefault().Id);
}
} public void FindAll()
{
IList<Model.Post> postList = Model.Post.FindAll();
foreach (var post in postList)
{
Response.Write(post.Id.ToString() + "\n\r");
Response.Write(post.Subject + "\n\r");
Response.Write(post.Text + "\n\r");
Response.Write(post.DateAdded.ToString() + "\n\r");
}
}

源码下载:百度云

Castle ActiveRecord框架学习(一)的更多相关文章

  1. Castle ActiveRecord框架学习(二):快速搭建简单博客网站

    一.数据库 1.数据表 Category:类别标签表(字段Type=1为类别,Type=2为标签) Category_Post:类别标签与文章中间表 Post:文章表 Comment:评论表 2.数据 ...

  2. Castle.ActiveRecord多数据库配置

    最近使用Castle.ActiveRecord框架,网上关于多数据支持的文章很少,因此有了这篇博文的产生. 开发工具VS2015,Sql Server2008R2 新建数据库,数据初始化脚本如下: - ...

  3. Castle ActiveRecord简单介绍

    Castle ActiveRecord框架是一个基于.NET的ORM框架,它实现了ActiveRecord设计模式.它本身就是基于NHibernate,只是封 装了NHibernate的大部分烦杂细节 ...

  4. Castle ActiveRecord学习实践

    Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到IOC容器,再到WEB层的MVC框架.AOP,基本包括了整个开发过程中的所有东西,为我们快速的构建企业级的应用程序提供了很好的服务. ...

  5. Castle ActiveRecord学习(一)简介

    简介 来源:http://www.cnblogs.com/zxj159/p/4082987.html 一.Active Record(活动记录)模式 Active Record是业务逻辑层中(< ...

  6. Castle ActiveRecord学习(五)使用HQL语句查询

    来源:http://www.cnblogs.com/Terrylee/archive/2006/04/12/372823.html 一.HQL简单介绍HQL全名是Hibernate Query Lan ...

  7. Castle ActiveRecord学习(三)数据映射及特性描述

    Model中的Demo: using Castle.ActiveRecord; using Castle.ActiveRecord.Queries; using System; using Syste ...

  8. Castle ActiveRecord学习(二)配置、引用、程序启动

    来源:http://www.cnblogs.com/zxj159/p/4082987.html 配置数据库驱动: Model层引用:Castle.ActiveRecord.dll.NHibernate ...

  9. Castle ActiveRecord学习(六)数据验证

    参考.来源:http://www.cnblogs.com/Terrylee/archive/2006/04/13/374173.html https://github.com/castleprojec ...

随机推荐

  1. [ZigBee] 6、ZigBee基础实验——定时器3和定时器4(8 位定时器)

    上一节讲了16位定时器1,本节讲8位定时器3和定时器4! 1.综述 Timer 3 and Timer 4 are two 8-bit timers(8位定时器). Each timer has tw ...

  2. [stm32] STM32的通用定时器TIMx系统了解

    通用定时器(TIMx) 一.TIMx简介 二.TIMx主要功能 三.TIMx功能描述 3.1 时基单元 3.2 计数器模式 3.3 时钟选择 3.4 捕获/比较通道 3.5 输入捕获模式 3.6 PW ...

  3. git 仓库、分支的区别

    首先,要明白仓库的概念 仓库可以理解为repository, 就是存放代码的地方,—— 其实是一个比较笼统的概念,不管里面的内容,总之存放各种资源(代码.图片等等) 对于git应用开发者而已,本地一般 ...

  4. linux奇技淫巧

    用着用着就发现,linux的每个命令都是那么的深奥而富有技巧,实用而淫荡..真可谓奇技淫巧.... 初学的真不易掌握... http://www.cnblogs.com/include/archive ...

  5. 爱上MVC3~布局页的继承与扩展

    回到 目录 在MVC3中引入了Razor引擎,这对于代码的表现力上是个突破,同时母板页也变成了_Layout,所以,我们就习惯上称它为布局页面,在razor里,布局页面是可以继承的,即,一个上下公用的 ...

  6. 前端那点事儿——Tocify自动生成文档目录

    今天偶然间看到文档服务器有一个动态目录功能,点击目录能跳转到指定的位置:窗口滑动也能自动更新目录的焦点. 效果 框架 原来使用的是一个开源的jquery-ui控件——tocify.js,它可以遍历页面 ...

  7. struts2学习笔记之五:表单数据收集的几种方式

    方法一:struts2对ModelDriven模式的支持(模型驱动模式) Struts2可以采用类似于Struts1中的ActionForm方式收集数据,这样方式叫ModelDriven模式 Acti ...

  8. 每天一个linux命令(44):top命令

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top是一个动态显示过程,即可以通过用户按键来不断刷新 ...

  9. cordova编译报错:Execution failed for task ':processDebugResources'

    cordova编译报错:Execution failed for task ':processDebugResources' 引发这个错误的最扩祸首就是一个中文命名的文件,不知道什么时候加入的,我写了 ...

  10. dic+css页面布局分享

    HTML部分代码<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...