一、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. [ACM_动态规划] 嵌套矩形

    问题描述:有n个矩阵,每个矩阵可以用两个整数a,b来表示 ,表示他的长和宽,矩阵X (a,b) 可以 嵌套 到Y (c,d) 里面当且仅当 a < c &&  b < d  ...

  2. Android Fragment add/replace以及backstack

    无论Fragment以何种方式加入,都不会影响backstack,backstack由addToBackStack函数决定,只有调用了这个函数,才会将Fragment加入返回栈.这个说法其实不太准确, ...

  3. 移动端基于HTML模板和JSON数据的JavaScript交互

    写本文之前,我正在做一个基于Tab页的订单中心: 每点击一个TAB标签,会请求对应状态的订单列表.之前的项目,我会在js里使用 +  连接符连接多个html内容: var html = ''; htm ...

  4. Atitit vod ver 12 new feature v12 pb2 影吧 视频 电影 点播 播放系统v12新特性

    Atitit vod ver 12 new feature v12 pb2 影吧 视频 电影 点播 播放系统v12新特性 项目分离从独立的se ver Run mode from brow ex to ...

  5. web 安全

    一.客户端脚本安全 (1)跨站脚本攻击(XSS): XSS攻击,通常指黑客通过“html注入” 篡改了网页,插入了恶意的脚本,从而在用户浏览网页的时候,控制用户浏览器的一种攻击. 最常见的XSS攻击就 ...

  6. vue隐藏APP启动时显示的{{}}

    vue隐藏APP启动时显示的{{}} vue组件在编译好之前会显示{{msg}},在官网上找到这个

  7. app的同源和域的问题

    app的同源和域的问题

  8. 关于json序列化和反序列的问题,没事写个案例,希望能帮到那些需要帮忙的朋友!

    现在关于json的读写问题,有许许多多的解决方法,因人而异,根据实际问题去选择自己想要的最容易方法.我觉得自带的Newtonsoft.Json是个不错的选择,随便写两个例子吧! 一:关于简单的json ...

  9. TSql Top 用法

    第一部分:TSql Top 有两种用法 1,限制查询结果集返回的行数或总行数的百分比. 当将 TOP 与 ORDER BY 子句结合使用时,结果集限制为前 N 个已排序行:否则,以未定义的顺序返回前 ...

  10. 简单使用AutoMapper实现DTO转换

    DTO(Data Transfer Object)数据传输对象,只是传输数据,完成与领域对象之间的转换,并不包含领域业务处理. 当领域模型设计人员只关注核心业务,满足于领域模型的精巧,而不关心具体实现 ...