Castle ActiveRecord Hands On Lab(1):基本数据访问

随着Castle1.0 RC2版本的发布,Castle逐渐走向成熟和趋于稳定,打算在近期写几篇关于ARHands On Lab。本篇文章将会介绍AR中最基本的数据访问,包括数据简单筛选和模糊查询等。在开始本Hands On Lab之前,请先下载并安装Castle 1.0 RC2。在整个Hands On Lab中,我们将使用Northwind数据库作为示例,开发环境为VS2005

1.新建Castle ActiveRecord 项目,安装Castle之后会在新建项目对话框中看到Castle ActiveRecord项目类型,输入项目名Models

在生成一个Models项目的同时,也为我们生成了一个Models.Test的单元测试项目,这里我们不用测试驱动的方法,直接删除该测试项目就可以了。

2.在Models项目中添加Customer实体类,并引入命名空间:

using Castle.ActiveRecord;

完成后Customer实体类代码如下:

[ActiveRecord("Customers")]

public class Customer : ActiveRecordBase<Customer>

{

    
private String _customerID;

    
private String _companyName;

    
private String _contactName;

    
private String _contactTitle;

    
private String _address;

    
private String _city;

    
private String _region;

    
private String _postalCode;

    
private String _country;

    
private String _phone;

    
private String _fax;

    [PrimaryKey(PrimaryKeyType.Assigned)]

    
public String CustomerID

    
{
        
get return _customerID; }

        
set { _customerID = value; }
    }


    [Property]

    
public String CompanyName

    
{
        
get return _companyName; }

        
set { _companyName = value; }
    }


    [Property]

    
public String ContactName

    
{
        
get return _contactName; }

        
set { _contactName = value; }
    }


    [Property]

    
public String ContactTitle

    
{
        
get return _contactTitle; }

        
set { _contactTitle = value; }
    }


    [Property]

    
public String Address

    
{
        
get return _address; }

        
set { _address = value; }
    }


    [Property]

    
public String City

    
{
        
get return _city; }

        
set { _city = value; }
    }


    [Property]

    
public String Region

    
{
        
get return _region; }

        
set { _region = value; }
    }


    [Property]

    
public String PostalCode

    
{
        
get return _postalCode; }

        
set { _postalCode = value; }
    }


    [Property]

    
public String Country

    
{
        
get return _country; }

        
set { _country = value; }
    }


    [Property]

    
public String Phone

    
{
        
get return _phone; }

        
set { _phone = value; }
    }


    [Property]

    
public String Fax

    
{
        
get return _fax; }

        
set { _fax = value; }
    }


}


ActiveRecord特性来指定表名为Customers

3.新建Web Site,删除默认的Default.aspx页面,添加一个Master页面,在页面加入如下元素:

<div>

    
<h2>Castle ActiveRecord Hands On Lab</h2>

    
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">

    
</asp:contentplaceholder>

</div>

4.添加ASPX页面,并选择刚才的Master页面作为它的母版页,在ASPX页面中添加一个GridView控件,如下所示:

GridView中添加绑定列,最终代码如下:

<asp:GridView ID="GridView1" runat="server" Width="610px" AutoGenerateColumns="false">

    
<Columns>

        
<asp:BoundField DataField="CustomerID" HeaderText="CustomerID" />

        
<asp:BoundField DataField="ContactName" HeaderText="ContactName" />

        
<asp:BoundField DataField="Country" HeaderText="Country" />

        
<asp:BoundField DataField="Phone" HeaderText="Phone" />

    
</Columns>

</asp:GridView>

5.编写绑定代码,在Page_Load中加入GridView的绑定代码。

protected void Page_Load(object sender, EventArgs e)

{
    
this.GridView1.DataSource = Customer.FindAll();

    
this.GridView1.DataBind();
}

这里使用了静态的FindAll()方法,该方法已经在泛型的ActiveRecordBase中作了定义,不需要再在实体类中实现。

6.编写配置文件,在Web项目中添加Web.config文件,在Web.config中添加ActiveRecord配置区。

<configSections>

  
<section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord"/>

</configSections>

<connectionStrings>

  
<add name="NorthWind" connectionString="Data Source=1DD43B143D104DB;Initial Catalog=Northwind;User ID=sa;Password=sa"/>

</connectionStrings>

<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="ConnectionString = ${NorthWind}"/>

  
</config>

</activerecord>

由于是Web项目,这里ActiveRecord配置区的isWeb属性必须设置为true

7.初始化ActiveRecord实体类。在Web Site中添加Global.asax,并导入命名空间:

<%@ Import Namespace="Models" %>

Application_Start中添加初始化代码:

void Application_Start(object sender, EventArgs e) 

{
   Castle.ActiveRecord.Framework.IConfigurationSource source 
=  System.Configuration.ConfigurationManager.GetSection("activerecord"as Castle.ActiveRecord.Framework.IConfigurationSource;

   Castle.ActiveRecord.ActiveRecordStarter.Initialize(System.Reflection.Assembly.Load(
"Models"),source);

}

这里可以对单个实体类进行初始化或者加载整个程序集。

8.至此,一个最简单的基于ActiveRecord的数据查询就做完了,运行后如下:

9.简单的数据筛选,在ActiveRecordBase基类中提供了一个方法FindAllByProperty,可以使用属性进行查询,如我们只查询国家为“UK”的Customer,在Page_Load中修改绑定代码如下:

protected void Page_Load(object sender, EventArgs e)

{

    
this.GridView1.DataSource = Customer.FindAllByProperty("Country","UK");

    
this.GridView1.DataBind();

}

运行后如下:

10.使用NHibernate的表达式来进行数据筛选。首先引入命名空间:

using NHibernate.Expression;

Page_Load中修改绑定代码如下所示,我们仍然查询国家为“UK”的Customer

protected void Page_Load(object sender, EventArgs e)

{

    
this.GridView1.DataSource = Customer.FindAll(Expression.Eq("Country""UK"));

    
this.GridView1.DataBind();

}

运行后与上面使用FindAllByProperty()方法的查询结果一致。

11.实现简单的模糊匹配查询。在Default.aspx页面中添加一个LabelTextBoxButton控件,如下图所示,这里我们对ContactName添加模糊查询功能:

HTML代码:

<asp:Label ID="Label1" runat="server" Text="ContactName:"></asp:Label>

<asp:TextBox ID="txt_Search" runat="server" Width="242px"></asp:TextBox>

<asp:Button ID="btn_Search" runat="server" OnClick="btn_Search_Click" Text="Search" />

切换到设计视图,双击Search按钮,添加Click事件,并编写代码,这里用HQL语句来实现,关于HQL语句可以参考http://www.hibernate.org/hib_docs/reference/en/html/queryhql.html。完成后代码如下:

protected void btn_Search_Click(object sender, EventArgs e)

{

    IActiveRecordQuery query 
= new HqlBasedQuery(typeof(Customer), "from Customer c where c.ContactName like ?""%" + this.txt_Search.Text + "%");

    
this.GridView1.DataSource = ActiveRecordMediator.ExecuteQuery(query);

    
this.GridView1.DataBind();

}

运行后在文本框中输入Mar,可以看到结果如下:

本文简单的介绍到这里。

示例下载:http://files.cnblogs.com/Terrylee/ARHandsOnLab.rar

更多Castle的文章请访问《Castle 开发系列
作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2006-11-19 21:22 TerryLee 阅读(6539) 评论(52)  编辑 收藏 网摘 所属分类: [12]  开源世界

  回复  引用  查看    
#1楼2006-11-19 21:25 | Dflying Chen      
good
  回复  引用  查看    
#2楼2006-11-19 21:33 | neuhawk      
偶打算学ado 3.0了.
asp.net ajax,wcf,wwf,wpf,ado 3.0 wpf/e,wss 3.0,vsto等等,太多新的东西要出来了,累死人.

  回复  引用  查看    
#3楼[楼主]2006-11-19 21:39 | TerryLee      
@Dflying Chen
谢谢:)

  回复  引用  查看    
#4楼[楼主]2006-11-19 21:40 | TerryLee      
@neuhawk
ADO.NET 3.0要学,一些开源框架也要学啊:)

//不过新东西确实太多了,我们已经淹没在了新技术的海洋里了,呵呵

  回复  引用    
#5楼2006-11-19 21:41 | 木野狐[匿名]
:)
  回复  引用  查看    
#6楼2006-11-19 21:46 | neuhawk      
我现在正用wf做电子审批.wcf,wpf推广有点困难, asp.net ajax也差不多要开始学了,wpf/e一出来就学,因为wpf已经出正式版,wpf/e更象一个虚拟机.
ado.net3.0是非常好的技术,可惜要下个4G的vs测试版,所以也懒得下载,再等等了.

  回复  引用  查看    
#7楼2006-11-19 21:49 | dudu      
谢谢TerryLee又为大家贡献好的学习材料!
  回复  引用  查看    
#8楼2006-11-19 21:56 | main      
只有get,set的实体是否可取,在java社区讨论的非常厉害
.NET下呢?也讨论下呢:)
http://www.javaeye.com/topic/11712

  回复  引用  查看    
#9楼[楼主]2006-11-19 21:59 | TerryLee      
@木野狐[匿名]
谢谢:)

  回复  引用  查看    
#10楼[楼主]2006-11-19 22:00 | TerryLee      
@dudu
谢谢dudu老大的支持,呵呵

  回复  引用  查看    
#11楼[楼主]2006-11-19 22:02 | TerryLee      
@neuhawk
WCF应该还可以吧,在SOA中应该会有很出色的表现

ADO.NET3.0再等等学习也不迟:)

  回复  引用  查看    
#12楼[楼主]2006-11-19 22:04 | TerryLee      
@main
这里的实体其实不是只有get,set,在基类中定义了很多的静态方法

//在.NET下,关于领域模型的确讨论的比较少

  回复  引用  查看    
#13楼2006-11-19 22:13 | neuhawk      
wcf,wpf要求xp sp2以上操作系统,在客户端比较难推广啊.
领域模型的讨论,我觉得ado.net 3.0的做法很好.

  回复  引用  查看    
#14楼2006-11-19 22:41 | main      
@TerryLee
您说的对.但是在项目中遇到这样问题的几率不比java中少
诶,现在我的项目中就出现这个问题

  回复  引用  查看    
#15楼[楼主]2006-11-19 22:45 | TerryLee      
@main
@neuhawk
:)

  回复  引用  查看    
#16楼2006-11-20 09:22 | Tseng      
遗憾的是AR还是用NH的1.02版本,现在NH已经到1.20BETA2了
  回复  引用    
#17楼2006-11-20 10:22 | 张豪[匿名][未注册用户]
太好了这两天,都在找这方面的文章,但是很多都是没有根实例结合,或者是没有很直观的呈现结果,非常感谢TerryLee 这中从代码到显示结果的图片式写作方式,希望大哥能够坚持写这样的文章,一目了然,谢谢 非常感谢
  回复  引用    
#18楼2006-11-20 10:28 | 张豪[匿名][未注册用户]
以前你写的IOC,这两天一直再看,但是实在是看不懂,因为没有跟案例显示结果相结合。能不能想你上面这样的教程在在组织一些写作呢。像monorail,IOC,Velocity,这两天一个团队的一个成员用castle,但是我还不熟悉希望terrylee大哥能够在这放面多下下功夫 谢谢
  回复  引用  查看    
#19楼[楼主]2006-11-20 11:54 | TerryLee      
@Tseng
没错,不知道为什么一直没有更新

  回复  引用  查看    
#20楼[楼主]2006-11-20 11:56 | TerryLee      
@张豪[匿名]
在本系列的Hands On Lab的后面,我会给出一个使用Castle IOC的三层结构的例子,供参考:)

  回复  引用    
#21楼2006-11-20 14:54 | GTO[未注册用户]
为什么我编译时会提示我错误呢?

找不到类型或命名空间名称“Models”(是否缺少 using 指令或程序集引用?)
<%@ Import Namespace="Models" %>

  回复  引用    
#22楼2006-11-20 14:56 | GTO[未注册用户]
自己搞定了,呵呵!
好文章期待你的新作。

  回复  引用  查看    
#23楼[楼主]2006-11-20 15:09 | TerryLee      
@GTO
唉,我在文章中有提到这一点啊,没仔细看,呵呵

  回复  引用    
#24楼2006-11-21 17:43 | 张豪[匿名][未注册用户]
GTO 兄我的也是这个问题,怎么改都不行啊,郁闷啊,
  回复  引用  查看    
#25楼[楼主]2006-11-21 17:57 | TerryLee      
@张豪[匿名]
引入命名空间
<%@ Import Namespace="Models" %>

  回复  引用    
#26楼2006-11-28 20:33 | 张豪[匿名][未注册用户]
请问 terrylee大哥,这可系列的教程什么时候能再出来呢,一直都在期待中啊 谢谢

  回复  引用  查看    
#27楼[楼主]2006-11-28 21:38 | TerryLee      
@张豪[匿名]
这个我不敢保证,毕竟还要工作,只能利用业余时间写写了

  回复  引用    
#28楼2006-11-28 22:44 | Leo[匿名][未注册用户]
TerryLee,
Castle系列写的不错。有没有one2many使用的泛型的实例可以参考一下?

  回复  引用  查看    
#29楼[楼主]2006-11-28 23:23 | TerryLee      
@Leo[匿名]
现在还没有,我过段时间找时间写一下吧:)

  回复  引用    
#30楼2006-11-29 11:46 | Leo[匿名][未注册用户]
呵呵,期待中。
能不能先提示一下,是否一定要在构造函数中加 EntitySet和EntityRef?希望有别的思路

  回复  引用    
#31楼2006-11-29 19:51 | yupeng[未注册用户]
新的castle activerecord的实体类好象没有生成工具了是吗?
  回复  引用  查看    
#32楼[楼主]2006-11-29 21:27 | TerryLee      
@yupeng
最新的没有了,现在有一款集成到VS2005的AR代码生成插件,改天介绍一下:)

  回复  引用    
#33楼2007-01-13 11:47 | zypro[未注册用户]
@TerryLee
VS2005的AR代码生成插件能否给个下载地址?

  回复  引用  查看    
#34楼[楼主]2007-01-15 08:36 | TerryLee      
@zypro
在ayende的Blog上有过介绍,你可以看一下

具体的地址我现在找不到了

  回复  引用    
#35楼2007-02-27 18:35 | ken[未注册用户]
楼主,请问你说的AR代码生成插件叫什么名字呢?谢谢
  回复  引用  查看    
#36楼2007-04-14 18:05 | levinknight      
value="ConnectionString = ${NorthWind}"???
這樣寫不行吧?

  回复  引用    
#37楼2007-05-24 10:44 | polo[未注册用户]
初学Castle,为什么总是:未能找到元素“activerecord”的架构信息?
郁闷

  回复  引用    
#38楼2008-09-18 10:59 | 四月[未注册用户]
我按照你说的去做,怎么只读了一个字段出来啊!



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 565346




相关文章:

相关链接: