Castle ActiveRecord框架学习(一)
一、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
数据库: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框架学习(一)的更多相关文章
- Castle ActiveRecord框架学习(二):快速搭建简单博客网站
一.数据库 1.数据表 Category:类别标签表(字段Type=1为类别,Type=2为标签) Category_Post:类别标签与文章中间表 Post:文章表 Comment:评论表 2.数据 ...
- Castle.ActiveRecord多数据库配置
最近使用Castle.ActiveRecord框架,网上关于多数据支持的文章很少,因此有了这篇博文的产生. 开发工具VS2015,Sql Server2008R2 新建数据库,数据初始化脚本如下: - ...
- Castle ActiveRecord简单介绍
Castle ActiveRecord框架是一个基于.NET的ORM框架,它实现了ActiveRecord设计模式.它本身就是基于NHibernate,只是封 装了NHibernate的大部分烦杂细节 ...
- Castle ActiveRecord学习实践
Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到IOC容器,再到WEB层的MVC框架.AOP,基本包括了整个开发过程中的所有东西,为我们快速的构建企业级的应用程序提供了很好的服务. ...
- Castle ActiveRecord学习(一)简介
简介 来源:http://www.cnblogs.com/zxj159/p/4082987.html 一.Active Record(活动记录)模式 Active Record是业务逻辑层中(< ...
- Castle ActiveRecord学习(五)使用HQL语句查询
来源:http://www.cnblogs.com/Terrylee/archive/2006/04/12/372823.html 一.HQL简单介绍HQL全名是Hibernate Query Lan ...
- Castle ActiveRecord学习(三)数据映射及特性描述
Model中的Demo: using Castle.ActiveRecord; using Castle.ActiveRecord.Queries; using System; using Syste ...
- Castle ActiveRecord学习(二)配置、引用、程序启动
来源:http://www.cnblogs.com/zxj159/p/4082987.html 配置数据库驱动: Model层引用:Castle.ActiveRecord.dll.NHibernate ...
- Castle ActiveRecord学习(六)数据验证
参考.来源:http://www.cnblogs.com/Terrylee/archive/2006/04/13/374173.html https://github.com/castleprojec ...
随机推荐
- Unity3D热更新全书-脚本(二) 两级分化
上篇明确了我们探讨的脚本是什么:是写在文本文件里面的代码,可以作为资源加载,取得字符串再执行. 可是为什么世界上会有那么多的脚本?而其使用方法完全看起来不一样呢?这是因为每种脚本都有自己的定位,在不同 ...
- http学习笔记(一)
写在前面: 第一次想写系列文章,学习了一些web知识后,发现自己还有很大的不足,但又不知道该学习些什么来完善自己的知识体系,偶然在网上看到了一篇介绍http的文章,觉得对自己有一些帮助,于是想要开始学 ...
- 换个角度理解云计算之MapReduce(二)
接上篇 3.Combiner操作 前面讲完Map操作,总结一下就是:一个大文件,分成split1~5,对应于Map1~5,每一个Map处理一个split,每一个split的每一行,会用每一个Map的m ...
- 纠结于搞.Net待遇不高的同学入...
最近看到不少抱怨搞.net工资低的帖子.别的方向我不是太清楚,作为搞了近8年.Net信息系统开发的码农也想发表下自己的意见. 由于我的阅历和能力有限,首先想限定下本文的范围.这里说的“信息系统”主要包 ...
- c基础回顾
发现一个很好的c学习网站http://see.xidian.edu.cn/cpp/html/ 做了一些练习: #include <string.h> #include <stdio. ...
- Java生成验证码原理(jsp)
验证码的作用: 验证码是Completely Automated Public Turing test to tell Computers and Humans Apart(全自动区分计算机和人类的 ...
- python学习 流程控制语句
##################################### 分支语句 python3.5 #########################################代码的缩进格 ...
- angularjs定义全局变量
angularjs定义全局变量 三种方法 直接外层定义全局变量 利用ng的value定义全局变量 利用ng的constant定义全局变量 Takl is cheap, Show me the code ...
- Liferay7 BPM门户开发之41: Expando API入门
Expando 是liferay的一种自定义表格扩展的方式,从5.0就已存在 , 可以在运行时新建表格\字段\行\值. 这是一种Service Builder之外的轻量级替代扩展方式,不必像Servi ...
- JAVA-集合作业-已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数
第二题 已知有十六支男子足球队参加2008 北京奥运会.写一个程序,把这16 支球队随机分为4 个组.采用List集合和随机数 2008 北京奥运会男足参赛国家: 科特迪瓦,阿根廷,澳大利亚,塞尔维亚 ...