Castle学习系列之一:初识Castle
说明:本系列文章参考自李会军先生的Castle 开发系列文章,然后记录自己在学习时遇到的一些问题,记录之。
主要内容
1.Castle概述
2.如何开始使用Castle
Castle概述
Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到IOC容器,再到WEB层的MVC框架、AOP,基本包括了整个开发过程中的所有东西,为我们快速的构建企业级的应用程序提供了很好的服务。
ORM,对象-关系映射(OBJECT/RELATION MAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法, 关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中 的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系 数据库数据的映射。面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个 不匹配的现象,对象关系映射技术应运而生。
CREATE TABLE [dbo].[Users] (
[LogonID] [int] IDENTITY (1, 1) NOT NULL ,
[LogonName] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL ,
[Password] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[EmailAddress] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL ,
[LastLogon] [datetime] NULL
) ON [PRIMARY]
GO
3、编写Users实体类 (项目新增类文件user.cs)
using System;
using System.Collections;
using Castle.ActiveRecord;
//注意下面两个引用哦!
namespace ARDemo
{
/**//// <summary>
/// User 的摘要说明。
/// </summary>
//为User类添加特性,其实就是告诉ActiveRecord,User类所对应的数据库中的数据表名为Users
[ActiveRecord("Users")]
// 新建一个User类并让它继承于ActiveRecordBase类
public class User : ActiveRecordBase
{
//为实体类添加属性
private int _id;
private string _name;
private string _password;
private string _emailAddress;
private DateTime _lastLogon;
//[PrimaryKey]特性指定Id作为主键,并且说明了主键的类型为自增型的
[PrimaryKey(PrimaryKeyType.Identity, "LogonID")]
public int Id
{
get { return _id; }
set { _id = value; }
}
//下面每一个属性上面都加上了特性[Property()]
[Property("LogonName")]
public string Name
{
get { return _name; }
set { _name = value; }
}
[Property("Password")]
public string Password
{
get { return _password; }
set { _password = value; }
}
[Property("EmailAddress")]
public string Address
{
get { return _emailAddress; }
set { _emailAddress = value; }
}
[Property("LastLogon")]
public DateTime LastLogon
{
get { return _lastLogon; }
set {_lastLogon = value; }
}
//根据需要为实体类加上静态的操作方法,
//至于Create(),Update(),Delete(),Save()等方法则会直接从ActiveRecordBase基类中继承
public static void DeleteAll()
{
DeleteAll( typeof(User) );
}
public static IList FindAll()
{
return (IList) FindAll( typeof(User) );
}
public static User Find(int id)
{
return (User) FindByPrimaryKey( typeof(User), id );
}
}
}
4、配置Castle ActiveRecord
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord"/>
</configSections>
<activerecord>
<config>
<add key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<add key="dialect" value="NHibernate.Dialect.MsSql2008Dialect" />
<add key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" />
<add key="connection.connection_string" value="Data Source=localhost;Initial Catalog=Study;User ID=sa;Password=******" />
</config>
</activerecord>
<system.web>
<compilation debug="true"/>
</system.web>
</configuration>
5、初始化,可以再程序开始的地方执行(如Application_Start)
IConfigurationSource cfgSrc = System.Configuration.ConfigurationManager.GetSection("activerecord") as IConfigurationSource;
ActiveRecordStarter.Initialize(cfgSrc, typeof(User));
6、进行实际的运用
User user = new User();
user.Name = "XXX";
user.Password = "123";
user.Address = "XXX@126.com";
user.LastLogon = DateTime.Now;
user.Create();
此时,运行程序之后,就会发现数据库中添加了一条新的纪录。
遇到的问题
如果你采用最新版的Castle的程序集(非1.0版本),然后参照李会军先生文章的配置,可能会出错Could not find the dialect in the configuration。这个时候我解决问题的方法是将配置文件中的hibernate前缀给去掉。
去掉前
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord"/>
</configSections>
<activerecord>
<config>
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2008Dialect" />
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="hibernate.proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" />
<add key="hibernate.connection.connection_string" value="Data Source=localhost;Initial Catalog=Study;User ID=sa;Password=******" />
</config>
</activerecord>
<system.web>
<compilation debug="true"/>
</system.web>
</configuration>
去掉后
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord"/>
</configSections>
<activerecord>
<config>
<add key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<add key="dialect" value="NHibernate.Dialect.MsSql2008Dialect" />
<add key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" />
<add key="connection.connection_string" value="Data Source=localhost;Initial Catalog=Study;User ID=sa;Password=******" />
</config>
</activerecord>
<system.web>
<compilation debug="true"/>
</system.web>
</configuration>
再次说明:本系列文章参考自李会军先生的Castle 开发系列文章,然后记录自己在学习时遇到的一些问题,记录之。
浙公网安备 33010602011771号