这里主要来说明ActiveRecord的属性与数据库及其字段的对应关系。
主要以ActiveRecordAttribute、PrimaryKeyAttribute、PropertyAttribute来进行说明。
首先,对于ActiveRecordAttribute来说,是指定数据库表名与类之间进行映射的,如果表名和类名一致,
则可以直接通过 [ActiveRecord] ,但是如果数据库表名与类名之间不一致,则可以显式的进行指定:比如类名为OrderInfo,而数据库表名为Order,则对应的关系可以通过[ActiveRecord("Order")]来进行指定。
ActiveRecordAttribute说明:
属性 |
说明 |
示例 |
Table |
指定持久化类所对应的数据库表名,如果表名与类名相同,可以省略 |
[ActiveRecord("Blogs")] [ActiveRecord(Table="Blogs")]
|
Schema |
指定Schema的名字 |
Schema="ARDemo" |
Proxy |
指定一个接口,在延迟装载时作为代理使用 |
|
DiscriminatorColumn |
识别器的字段名 |
DiscriminatorColumn="Blog" |
DiscriminatorType |
识别器的字段类型 |
DiscriminatorType="String" |
DiscriminatorValue |
识别器字段的值 |
|
Where |
指定一个附加SQL的Where子句 |
Where="IsPost = 0" |
Lazy |
指定是否延迟加载 |
Lazy=true|false |
注意,里面的延迟加载问题,我在前面的文章中有过讨论。
其次就是PrimaryKeyAttribute属性的使用。这个从字面的意思上来看,就是指主键类型的。在一个表结构中,如果要指定主键,则可以使用这个属性名称来进行约束。 比如如果现有一个OrderID为主键,则可以这样的显示指定[PrimaryKey("OrderID")]或者[PrimaryKey(PrimaryKeyType.Identity,"OrderID")],但是如果这个字段和数据库的字段名称相同的话,直接可以隐式的来进行指定:[PrimaryKey],具体详细信息,请见下表:
PrimaryKeyAttribute说明
属性 |
说明 |
示例 |
PrimaryKeyType |
主键生成的方式,如果不指定,则默认的方式为PrimaryKeyType.Native |
PrimaryKeyType.Native |
Column |
主键字段名称,如果跟属性名相同,可以不用指定 |
PrimaryKey("blog_id") |
ColumnType |
主键字段的类型 |
|
Generator |
是一个.NET类的名字,用来为该持久化类的实例生成唯一的标识。 |
|
Params |
用Params来提供Generator所需要的配置参数或初始化参数 |
|
Length |
主键字段的长度 |
Length=10 |
SequenceName |
当指定主键的生成方式为Sequence时,序列的名称 |
PrimaryKey(PrimaryKeyType.Sequence, SequenceName="myseqname") |
UnsavedValue |
用来标志该实例是刚刚创建的,尚未保存。 |
|
主键的生成方式介绍
名称 |
说明 |
Identity |
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持,生成自增的整型 |
Sequence |
序列,对DB2,MySQL, PostgreSQL, Oracle的内置标识字段提供支持,生成自增的整型。 |
HiLo |
高低位,使用一个高/低位算法来高效的生成Int64, Int32 或者 Int16类型的标识符。 |
SeqHiLo |
使用序列的高低位,使用一个高/低位算法来高效的生成Int64, Int32 或者 Int16类型的标识符,给定一个数据库序列(sequence)的名字。 |
UuidHex |
用一个System.Guid和它的ToString(string format)方法生成字符串类型的标识符。 |
UuidString |
用一个新的System.Guid产生一个byte[] ,把它转换成字符串。 |
Guid |
用一个新的System.Guid 作为标识符。 |
GuidComb |
用Jimmy Nilsso的一个算法产生一个新的System.Guid。 |
Native |
根据底层数据库的能力选择 identity, sequence 或者 hilo中的一个。默认值。 |
Assigned |
让应用程序在自己为对象分配一个标示符。 |
Foreign |
使用另外一个相关联的对象的标识符。 |
最后就是要说的是PropertyAttribute,这个主要是表中的字段和类中的字段进行对应的,和前面一样,如果表字段名称和类字段名称一致,则可以直接利用[Property]来指定,否则需要利用[Property("OrderName")]来进行指定:
说明
属性 |
说明 |
示例 |
Column |
对应的数据库字段名 |
Property("blog_name") |
ColumnType |
对应的字段类型 |
|
Formula |
一个SQL表达式,定义了这个计算(computed)属性的值。计算属性没有和它对应的数据库字段。 |
|
UnsavedValue |
用来标志该实例是刚刚创建的,尚未保存。 |
|
Length |
字段的长度 |
Length=10 |
NotNull |
是否可以为空 |
NotNull=true|false |
Unique |
是否允许重复 |
Unique=true|false |
Update |
表明在用于UPDATE 的SQL语句中是否包含这个字段。默认为true |
Update=true|false |
Insert |
表明在用于INSERT的SQL语句中是否包含这个字段。默认为true |
Insert=true|false |
下面是一个具体的例子:
数据库:
USE [NewsDemo]
GO
/****** Object: Table [dbo].[Order] Script Date: 10/23/2011 12:59:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Order](
[OrderID] [int] IDENTITY(1,1) NOT NULL,
[OrderName] [nvarchar](50) NULL,
CONSTRAINT [PK_Order] PRIMARY KEY CLUSTERED
(
[OrderID] 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
代码:
using Castle.ActiveRecord;
using System.Collections;
namespace CastleLib
{
[ActiveRecord("Order")]
public class OrderInfo:ActiveRecordBase
{
private int _OrderId;
private string _OrderName;
[PrimaryKey(PrimaryKeyType.Identity,"OrderId")]
public int OrderId
{
get { return _OrderId; }
set { _OrderId = value; }
}
[Property("OrderName")]
public string OrderName
{
get { return _OrderName; }
set { _OrderName = value; }
}
public static void DeleteAll()
{
DeleteAll(typeof(OrderInfo));
}
public static IList FindAll()
{
return (IList)FindAll(typeof(OrderInfo));
}
public static OrderInfo Find(int id)
{
return (OrderInfo)FindByPrimaryKey(typeof(OrderInfo), id);
}
}
}
通过上面的映射,就可以使用了。具体的还有FieldAttribute,CompositeKeyAttribute,留待研究。