代码改变世界

Castle.ActiveRecord 学与练[3]

2008-04-08 10:59  土星的狗狗  阅读(2337)  评论(10编辑  收藏  举报

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

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

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

ON [PRIMARY],
 
CONSTRAINT [UC_role_name] UNIQUE NONCLUSTERED
 
(
    
[name] ASC

ON [PRIMARY]
ON [PRIMARY]
GO

CREATE TABLE [dbo].[users](
    
[LogonID] [int] IDENTITY(1,1NOT 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
,
 
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
 
(
    
[LogonID] ASC

ON [PRIMARY]
ON [PRIMARY]
GO

CREATE TABLE [dbo].[userrole](
    
[userroleid] [int] IDENTITY(1,1NOT NULL
,
    
[userid] [int] NOT NULL
,
    
[roleid] [int] NOT NULL
,
 
CONSTRAINT [PK_userrole] PRIMARY KEY CLUSTERED
 
(
    
[userroleid] ASC

ON [PRIMARY]
ON [PRIMARY]

GO
ALTER TABLE [dbo].[userrole]  WITH CHECK ADD  CONSTRAINT [FK_user_userid] FOREIGN KEY([userid])
REFERENCES [dbo].[users] ([LogonID]
)
GO

ALTER TABLE [dbo].[userrole]  WITH CHECK ADD  CONSTRAINT [FK_userrole_role_roleid] FOREIGN KEY([roleid])
REFERENCES [dbo].[role] ([roleid]
)
GO

第一部分:特性介绍
ActiveRecordAttribute:
--------------------------------------------------------------------------------------------------------------------------------------
  Name Description
Public property BatchSize
From NHibernate documentation: Specify a "batch size" for fetching instances of this class by identifier.
Public property DiscriminatorColumn
Gets or sets the Discriminator column for a table inheritance modeling
为表设置一个识别器字段
Public property DiscriminatorType
Gets or sets the column type (like string or integer) for the discriminator column
为识别器字段设置一个字段类型(例如:String或者Int)
Public property DiscriminatorValue
Gets or sets the value that represents the target class on the discriminator column
为识别器字段设置一个可以描述目标类的值
Public property DynamicInsert
From NHibernate documentation: Specifies that INSERT SQL should be generated at runtime and contain only the columns whose values are not null.
Public property DynamicUpdate
From NHibernate documentation: Specifies that UPDATE SQL should be generated at runtime and contain only those columns whose values have changed.
Public property Lazy
Enable lazy loading for the type
打开延迟加载
Public property 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.
Public property Locking
From NHibernate documentation: Determines the optimistic locking strategy.
Public property Mutable
From NHibernate documentation: Specifies that instances of the class are (not) mutable.
Public property Persister
From NHibernate documentation: Specifies a custom IEntityPersister.
Public property Polymorphism
From NHibernate documentation: Determines whether implicit or explicit query polymorphism is used.
Public property Proxy
Associates a proxy type with the target type
Public property Schema
Gets or sets the schema name associated with the type
设置概要的信息
Public property 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.
Public property Table
Gets or sets the table name associated with the type
表名,类名与表名相同可为空
Public property 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.
Public property Where
SQL condition to retrieve objects
指定一个附加SQL的WHERE子句
--------------------------------------------------------------------------------------------------------------------------------------

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

PrimaryKeyType
--------------------------------------------------------------------------------------------------------------------------------------
Name Description
Public property 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() 方法执行时,便会触发数据库表自增类型字段自增.
Public property Sequence
Use a sequence
序列
Public property HiLo
Use the HiLo algorithm to get the next value 
高低位,使用一个高/低位算法来高效的生成Int64, Int32 或者 Int16类型的标识符。
Public property SeqHiLo
Use a sequence and a HiLo algorithm - better performance on Oracle
使用序列的高低位,使用一个高/低位算法来高效的生成Int64, Int32 或者 Int16类型的标识符,给定一个数据库序列(sequence)的名字。
Public property UuidHex
Use the hex representation of a unique identifier
用一个System.Guid和它的ToString(string format)方法生成字符串类型的标识符。
Public property UuidString
Use the string representation of a unique identifier
用一个新的System.Guid产生一个byte[] ,把它转换成字符串。
Public property Guid
Generate a Guid for the primary key Note: You should prefer using GuidComb over this value.
用一个新的System.Guid 作为标识符。
Public property GuidComb
Generate a Guid in sequence, so it will have better insert performance in the DB.
Jimmy Nilsso的一个算法产生一个新的System.Guid
Public property Native
Use an identity or sequence if supported by the database, otherwise, use the HiLo algorithm
根据底层数据库的能力选择 identity, sequence 或者 hilo中的一个。默认值。
Public property 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.
让应用程序在自己为对象分配一个标示符。
Public property Foreign
This is a foreign key to another table
外键
Public property Counter
Returns a Int64 constructed from the system time and a counter value.
返回一个INT64类型的系统时间和一个记数器值.
Public property Increment
Returns a Int64, constructed by counting from the maximum primary key value at startup.
主键最大值加1
Public property Custom
A custom generator will be provided. See CustomGenerator
--------------------------------------------------------------------------------------------------------------------------------------

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

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

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

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

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

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

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

[PrimaryKey(PrimaryKeyType.Identity, Column = "LogonID",ColumnType = "Int32")]
        
public int
 Id
        
{
            
get return _id; }

            
set { _id = value; }
              }

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

            
set { _name = value; }
        }


    实体类源码下载


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

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

Creative Commons License
It's my life