前段時間下載了castle的active record(AR)進行試用,通過幾天的研究使用,有些心得,現進行一下整理,將所學,所得,所惑都理一下,以待在以后能更好的學習研究.
本文主要內容:Castle-AR的基本使用,通過一個小小的例子,做到能熟練的使用AR,對AR有一個感性的認識,在以后空余時間能對其進行深入的研究,學習.
話不多說,進入主題,ORM的概念博客園上已經介紹得很多,這里就不再提及.先介紹一下例子,這是我自己想的一個環境,包括如下對象:Blog(博客),Post(隨筆),PostType(隨筆類型),Community(社區),之所以虛構這幾個對象,主要是想考察AR對各種關系的表現能力,和處理容易度,而這幾個對象之間可以包括數據庫中常見的一對多(Blog和Post的關系),多對一(Post和PostType的關系),多對多的關系(Blog和Community的關系),一對一的關系暫不考慮.庫的結構如下圖所示:
生成數據庫的腳本如下:
#region Sql
CREATE TABLE [dbo].[Blog] (
[BlogId] [int] IDENTITY (1, 1) NOT NULL ,
[BlogName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[BlogIntro] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[Email] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[RegistTime] [datetime] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Blog_Community] (
[BlogId] [int] NOT NULL ,
[CommunityId] [int] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Community] (
[CommunityId] [int] IDENTITY (1, 1) NOT NULL ,
[CommunityName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[CommunityIntro] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Post] (
[PostId] [int] IDENTITY (1, 1) NOT NULL ,
[PostTypeId] [int] NULL ,
[BlogId] [int] NULL ,
[PostName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[PostContext] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[PostTime] [datetime] NULL ,
[IsPost] [char] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[PostType] (
[PostTypeId] [int] IDENTITY (1, 1) NOT NULL ,
[PostTypeName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
#endregion1.AR 之 一對多.
在該例子中Blog與Post之間的關系是一對多的.現在我們先來介紹一下由AR Generator自動生成的代碼
[ActiveRecord("Blog")]
public class Blog : ActiveRecordBase
{
}
[PrimaryKey(PrimaryKeyType.Native)]
public int BlogId
{
get
{
return this.blogId;
}
set
{
this.blogId = value;
}
}現在到了關鍵,我們的一對多關系:
[HasMany(typeof(Post), Table="Post", ColumnKey="BlogId")]
public System.Collections.IList Posts
{
get
{
return this.posts;
}
set
{
this.posts = value;
}
}AR采用HasMany來描述這種關系,后面參數的名稱想必一看便知,Post是"多"的表名,BlogId是該表的主建.
好,我們再來看看Post類中的關鍵映射代碼:
[BelongsTo("BlogId")]
public Blog Blog
{
get
{
return this.blog;
}
set
{
this.blog = value;
}
}是不是同樣簡單呢?
2.AR 之 多對一.
(這就不多講了,只是HasMany和BelongsTo放的地方不同,關注的方向不同而已,用法都一樣)
3.AR之 多對多.
在這個例子中,Blog和Community是多對多的關系.在我們一般的設計中,一般會把多對多的兩個表拆成三個表,在這里,我加入了一個表Blog_Community.(該表不需要在AR中進行映射,AR會自動幫你完成相關操作).我們先看一下Blog里面的關鍵代碼:
[HasAndBelongsToMany(typeof(Community), Table="Blog_Community",ColumnRef="CommunityId", ColumnKey="BlogId")]
public System.Collections.IList Community
{
get
{
return this.community;
}
set
{
this.community = value;
}
}
[HasAndBelongsToMany(typeof(Blog), Table="Blog_Community",ColumnRef="BlogId", ColumnKey="CommunityId")]
public System.Collections.IList Blog
{
get
{
return this.blog;
}
set
{
this.blog = value;
}
}OK.這三種關系的映射就先介紹到這,以下是我寫的一些測試代碼.感興趣的可以瞄兩眼.
[Test]
public void TestBlogCRUD()
{
Blog b = new Blog();
b.BlogName = "DotNetFresh";
b.BlogIntro = "StudyDotNet";
b.Email = "hello@163.com";
b.RegistTime = DateTime.Now;
b.Create(); //C
b.BlogIntro = "Good good study,day day up";
b.Update(); //U
Blog bb = Blog.Find(b.BlogId); //R
bb.Delete(); //D
}
[Test]
public void TestAddBlogWithPostAndPostType()
{
//新建一個Blog
Blog b = new Blog();
b.BlogName = "withpost";
b.BlogIntro = "i'm have post already";
b.Email = "hello@163.com";
b.RegistTime = DateTime.Now;
//新建一個PostType
PostType type = new PostType();
type.PostTypeName = "new type";
//新建一個Post
Post p = new Post();
p.Blog = b;
p.PostType = type;
p.PostName = "new post";
p.PostTime = DateTime.Now;
//執行事務,將上面三個對象持久化到數據庫
using(TransactionScope transaction = new TransactionScope())
{
try
{
b.Create();
type.Create();
p.Create();
}
catch
{
transaction.VoteRollBack();
}
}
}
[Test]
public void TestAddBlogWithCommunity()
{
//新建一個Blog
Blog b = new Blog();
b.BlogName = "withcommunity";
b.BlogIntro = "i'm in a community already";
b.Email = "hello@163.com";
b.RegistTime = DateTime.Now;
//該Blog屬于的社區
ArrayList al = new ArrayList();
al.Add(Community.Find(3));
al.Add(Community.Find(4));
b.Community = al;
b.Create(); //保存
}總結,心得:Castle的AR底層將NHibernate封裝了起來,使用起來感覺比Nhibernate方便多了,不用再去生成一個個的映射文件,調試和維護起來都方便了很多,這應該是使用AR感覺最好的一個地方.另外配合著AR Generator,生成這些代碼那叫一個快.不過AR采用反射的方式來處理映射,如果項目大了,不知道會對性能造成多大的影響?另外,經過Castle的這樣封裝,如果再配合著Castle的容器,一定會發揮更大的威力.繼續研究學習吧.....:)

浙公網安備 33010602011771號