Castle.ActiveRecord引入了特性映射这个概念,使用.hbm.xml文件,从而更加清晰的呈现出了实体类跟数据库表之间的关系,使持久化的数据操作更加简单,易用.
    下面就让咱们一起来通过一个完整的实例了解一下Castle.ActiveRecord的Attribute.

    我们先来创建三个数据库表,接下来的文章练习都是围绕着这三个表来操作,便于演示一对多,多对一及相应的级联更新,删除等操作.

Castle.ActiveRecord 学与练[3]CREATE TABLE [dbo].[role](
Castle.ActiveRecord 学与练[3]    
[roleid] [int] IDENTITY(1,1NOT NULL
,
Castle.ActiveRecord 学与练[3]    
[name] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL
,
Castle.ActiveRecord 学与练[3]    
[permissionlevel] [int] NOT NULL DEFAULT (1
),
Castle.ActiveRecord 学与练[3]    
[inserttimestamp] [datetime] NOT NULL DEFAULT (getdate
()),
Castle.ActiveRecord 学与练[3]    
[updatetimestamp] [datetime] NOT NULL DEFAULT (getdate
()),
Castle.ActiveRecord 学与练[3] 
CONSTRAINT [PK_role] PRIMARY KEY CLUSTERED
 
Castle.ActiveRecord 学与练[3](
Castle.ActiveRecord 学与练[3]    
[roleid] ASC

Castle.ActiveRecord 学与练[3]
ON [PRIMARY],
Castle.ActiveRecord 学与练[3] 
CONSTRAINT [UC_role_name] UNIQUE NONCLUSTERED
 
Castle.ActiveRecord 学与练[3](
Castle.ActiveRecord 学与练[3]    
[name] ASC

Castle.ActiveRecord 学与练[3]
ON [PRIMARY]
Castle.ActiveRecord 学与练[3]
ON [PRIMARY]
Castle.ActiveRecord 学与练[3]
GO
Castle.ActiveRecord 学与练[3]
Castle.ActiveRecord 学与练[3]
CREATE TABLE [dbo].[users](
Castle.ActiveRecord 学与练[3]    
[LogonID] [int] IDENTITY(1,1NOT NULL
,
Castle.ActiveRecord 学与练[3]    
[LogonName] [varchar](40) COLLATE Chinese_PRC_CI_AS NULL
,
Castle.ActiveRecord 学与练[3]    
[Password] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL
,
Castle.ActiveRecord 学与练[3]    
[EmailAddress] [varchar](40) COLLATE Chinese_PRC_CI_AS NULL
,
Castle.ActiveRecord 学与练[3]    
[LastLogon] [datetime] NULL
,
Castle.ActiveRecord 学与练[3] 
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
 
Castle.ActiveRecord 学与练[3](
Castle.ActiveRecord 学与练[3]    
[LogonID] ASC

Castle.ActiveRecord 学与练[3]
ON [PRIMARY]
Castle.ActiveRecord 学与练[3]
ON [PRIMARY]
Castle.ActiveRecord 学与练[3]
GO
Castle.ActiveRecord 学与练[3]
Castle.ActiveRecord 学与练[3]
CREATE TABLE [dbo].[userrole](
Castle.ActiveRecord 学与练[3]    
[userroleid] [int] IDENTITY(1,1NOT NULL
,
Castle.ActiveRecord 学与练[3]    
[userid] [int] NOT NULL
,
Castle.ActiveRecord 学与练[3]    
[roleid] [int] NOT NULL
,
Castle.ActiveRecord 学与练[3] 
CONSTRAINT [PK_userrole] PRIMARY KEY CLUSTERED
 
Castle.ActiveRecord 学与练[3](
Castle.ActiveRecord 学与练[3]    
[userroleid] ASC

Castle.ActiveRecord 学与练[3]
ON [PRIMARY]
Castle.ActiveRecord 学与练[3]
ON [PRIMARY]
Castle.ActiveRecord 学与练[3]
Castle.ActiveRecord 学与练[3]
GO
Castle.ActiveRecord 学与练[3]
ALTER TABLE [dbo].[userrole]  WITH CHECK ADD  CONSTRAINT [FK_user_userid] FOREIGN KEY([userid])
Castle.ActiveRecord 学与练[3]
REFERENCES [dbo].[users] ([LogonID]
)
Castle.ActiveRecord 学与练[3]
GO

Castle.ActiveRecord 学与练[3]
ALTER TABLE [dbo].[userrole]  WITH CHECK ADD  CONSTRAINT [FK_userrole_role_roleid] FOREIGN KEY([roleid])
Castle.ActiveRecord 学与练[3]
REFERENCES [dbo].[role] ([roleid]
)
Castle.ActiveRecord 学与练[3]
GO

第一部分:特性介绍
ActiveRecordAttribute:
--------------------------------------------------------------------------------------------------------------------------------------
  Name Description
Castle.ActiveRecord 学与练[3] BatchSize
From NHibernate documentation: Specify a "batch size" for fetching instances of this class by identifier.
Castle.ActiveRecord 学与练[3] DiscriminatorColumn
Gets or sets the Discriminator column for a table inheritance modeling
为表设置一个识别器字段
Castle.ActiveRecord 学与练[3] DiscriminatorType
Gets or sets the column type (like string or integer) for the discriminator column
为识别器字段设置一个字段类型(例如:String或者Int)
Castle.ActiveRecord 学与练[3] DiscriminatorValue
Gets or sets the value that represents the target class on the discriminator column
为识别器字段设置一个可以描述目标类的值
Castle.ActiveRecord 学与练[3] DynamicInsert
From NHibernate documentation: Specifies that INSERT SQL should be generated at runtime and contain only the columns whose values are not null.
Castle.ActiveRecord 学与练[3] DynamicUpdate
From NHibernate documentation: Specifies that UPDATE SQL should be generated at runtime and contain only those columns whose values have changed.
Castle.ActiveRecord 学与练[3] Lazy
Enable lazy loading for the type
打开延迟加载
Castle.ActiveRecord 学与练[3] LazySpecified
Gets a value indicating whether explicit lazy behavior was specified. If explicit lazy behavior was not specified, it goes to the configuration to decide if the type should be lazy or not.
Castle.ActiveRecord 学与练[3] Locking
From NHibernate documentation: Determines the optimistic locking strategy.
Castle.ActiveRecord 学与练[3] Mutable
From NHibernate documentation: Specifies that instances of the class are (not) mutable.
Castle.ActiveRecord 学与练[3] Persister
From NHibernate documentation: Specifies a custom IEntityPersister.
Castle.ActiveRecord 学与练[3] Polymorphism
From NHibernate documentation: Determines whether implicit or explicit query polymorphism is used.
Castle.ActiveRecord 学与练[3] Proxy
Associates a proxy type with the target type
Castle.ActiveRecord 学与练[3] Schema
Gets or sets the schema name associated with the type
设置概要的信息
Castle.ActiveRecord 学与练[3] SelectBeforeUpdate
From NHibernate documentation: Specifies that NHibernate should never perform an SQL UPDATE unless it is certain that an object is actually modified. In certain cases (actually, only when a transient object has been associated with a new session using update()), this means that NHibernate will perform an extra SQL SELECT to determine if an UPDATE is actually required.
Castle.ActiveRecord 学与练[3] Table
Gets or sets the table name associated with the type
表名,类名与表名相同可为空
Castle.ActiveRecord 学与练[3] UseAutoImport
From NHibernate documentation: The auto-import attribute lets us use unqualified class names in the query language, by default. The assembly and namespace attributes specify the assembly where persistent classes are located and the namespace they are declared in.
Castle.ActiveRecord 学与练[3] Where
SQL condition to retrieve objects
指定一个附加SQL的WHERE子句
--------------------------------------------------------------------------------------------------------------------------------------

PrimaryKeyAttribute:
--------------------------------------------------------------------------------------------------------------------------------------
  Name Description
Castle.ActiveRecord 学与练[3] Column
Gets or sets the column name
设置字段名
Castle.ActiveRecord 学与练[3] ColumnType
Gets or sets the type of the column.
设置字段类型
Castle.ActiveRecord 学与练[3] CustomGenerator
Gets or sets the custom generator. The generator must implement IIdentifierGenerator
设置一个自定义的生成器.这个生成器必要实现IIdentifierGenerator接口
Castle.ActiveRecord 学与练[3] Generator
Gets or sets the generator.
设置一个生成器,是一个.NET类的名字,用来为该持久化类的实例生成惟一的标识.
Castle.ActiveRecord 学与练[3] Length
Gets or sets the length of values in the column
设置字段长度
Castle.ActiveRecord 学与练[3] Params
Comma separated value of parameters to the generator
用parameters来为生成器配置参数或者初始化参数.
Castle.ActiveRecord 学与练[3] SequenceName
Gets or sets the name of the sequence.
当指定主键的生成方式为Sequence时,序列的名称
当指定主键的生成方式为Sequence时,Sequence的名称.
Castle.ActiveRecord 学与练[3] UnsavedValue
Gets or sets the unsaved value.
设置该实例未保存时的值
--------------------------------------------------------------------------------------------------------------------------------------

PrimaryKeyType
--------------------------------------------------------------------------------------------------------------------------------------
Name Description
Castle.ActiveRecord 学与练[3] Identity
Use Identity column (auto number) Note: This force an immediate call to the DB when Create() is called
DB2,MySQL, MS SQL Server, SybaseHypersonicSQL的内置标识字段提供支持,生成自增的整型
当Create() 方法执行时,便会触发数据库表自增类型字段自增.
Castle.ActiveRecord 学与练[3] Sequence
Use a sequence
序列
Castle.ActiveRecord 学与练[3] HiLo
Use the HiLo algorithm to get the next value 
高低位,使用一个高/低位算法来高效的生成Int64, Int32 或者 Int16类型的标识符。
Castle.ActiveRecord 学与练[3] SeqHiLo
Use a sequence and a HiLo algorithm - better performance on Oracle
使用序列的高低位,使用一个高/低位算法来高效的生成Int64, Int32 或者 Int16类型的标识符,给定一个数据库序列(sequence)的名字。
Castle.ActiveRecord 学与练[3] UuidHex
Use the hex representation of a unique identifier
用一个System.Guid和它的ToString(string format)方法生成字符串类型的标识符。
Castle.ActiveRecord 学与练[3] UuidString
Use the string representation of a unique identifier
用一个新的System.Guid产生一个byte[] ,把它转换成字符串。
Castle.ActiveRecord 学与练[3] Guid
Generate a Guid for the primary key Note: You should prefer using GuidComb over this value.
用一个新的System.Guid 作为标识符。
Castle.ActiveRecord 学与练[3] GuidComb
Generate a Guid in sequence, so it will have better insert performance in the DB.
Jimmy Nilsso的一个算法产生一个新的System.Guid
Castle.ActiveRecord 学与练[3] Native
Use an identity or sequence if supported by the database, otherwise, use the HiLo algorithm
根据底层数据库的能力选择 identity, sequence 或者 hilo中的一个。默认值。
Castle.ActiveRecord 学与练[3] Assigned
The primary key value is always assigned. Note: using this you will lose the ability to call Save(), and will need to call Create() or Update() explicitly.
让应用程序在自己为对象分配一个标示符。
Castle.ActiveRecord 学与练[3] Foreign
This is a foreign key to another table
外键
Castle.ActiveRecord 学与练[3] Counter
Returns a Int64 constructed from the system time and a counter value.
返回一个INT64类型的系统时间和一个记数器值.
Castle.ActiveRecord 学与练[3] Increment
Returns a Int64, constructed by counting from the maximum primary key value at startup.
主键最大值加1
Castle.ActiveRecord 学与练[3] Custom
A custom generator will be provided. See CustomGenerator
--------------------------------------------------------------------------------------------------------------------------------------

PropertyAttribute:
--------------------------------------------------------------------------------------------------------------------------------------
  Name Description
Castle.ActiveRecord 学与练[3] Check
From NHibernate documentation: create an SQL check constraint on either column or table
约束
Castle.ActiveRecord 学与练[3] Column
Gets or sets the column name
设置字段名
Castle.ActiveRecord 学与练[3] ColumnType
Gets or sets the type of the column.
设置字段类型
Castle.ActiveRecord 学与练[3] Formula
Gets or sets the formula used to calculate this property
一个SQL表达式,定义了这个计算(computed) 属性的值。计算属性没有和它对应的数据库字段。
Castle.ActiveRecord 学与练[3] Index
From NHibernate documentation: specifies the name of a (multi-column) index
Castle.ActiveRecord 学与练[3] Insert
Set to false to ignore this property when inserting entities of this ActiveRecord class.

表明在用于INSERTSQL语句中是否包含这个字段。默认为true

Castle.ActiveRecord 学与练[3] Length
Gets or sets the length of the property (for strings - nvarchar(50) )
字段长度
Castle.ActiveRecord 学与练[3] NotNull
Gets or sets a value indicating whether this property allow null.
是否允许为空
Castle.ActiveRecord 学与练[3] SqlType
From NHibernate documentation: overrides the default column type
重写默认的字段类型.
Castle.ActiveRecord 学与练[3] Unique
Gets or sets a value indicating whether this PropertyAttribute is unique.
是否允许重复.
Castle.ActiveRecord 学与练[3] UniqueKey
From NHibernate documentation: A unique-key attribute can be used to group columns in a single unit key constraint.
Castle.ActiveRecord 学与练[3] Update
Set to false to ignore this property when updating entities of this ActiveRecord class.

表明在用于UPDATESQL语句中是否包含这个字段。默认为true

--------------------------------------------------------------------------------------------------------------------------------------

第二部分:源码讲解
ActiveRecordAttribute:
对于ActiveRecordAttribute来说,其中比较重要的参数就是Table了,用它来确定这个实体指向哪个数据库表.不填表示类实体名与数据库表名相同.
Castle.ActiveRecord 学与练[3]    [ActiveRecord(Table = "Users",Schema = "Training",Where = "1 = 1")]
Castle.ActiveRecord 学与练[3]    
public class
 Users : ActiveRecordBase
          }

PrimaryKeyAttribute:
对于PrimaryKeyAttribute来说,顾名思义此特性是为了设置主键而设计的,其中PrimaryKeyType为大家提供了多种类型可以应付各种情况,详见上面表格.

Castle.ActiveRecord 学与练[3][PrimaryKey(PrimaryKeyType.Identity, Column = "LogonID",ColumnType = "Int32")]
Castle.ActiveRecord 学与练[3]        
public int
 Id
              }

Property
Attribute:
对于PropertyAttribute来说Column参数相对重要,用它来确定属性对应数据库表中哪个字段,如果为空则字段名与属性名相同.
Castle.ActiveRecord 学与练[3]        [Property(Column = "Name", NotNull = true, ColumnType = "String")]
Castle.ActiveRecord 学与练[3]        
public string
 Name
        }


    实体类源码下载


    最近真是太忙了,SAP一直在我们周围转啊转,终于到了要上线的地步了.
    写了这一些,先给大家看看吧,下一篇会在数据的操作上向大家演示Castle.ActiveRecord的奇妙之处,以完成Castle的Castle.ActiveRecord部分,敬请关注. 

     谢谢
Terrylee老师的教程对我的帮助.
    QQ:22566547;
    MSN:LGUYSS@GMAIL.COM;
    SITE:WWW.MOBILEBETA.NET

相关文章: