Castle ActiveRecord学习实践(3):映射基础

摘要:本文详细介绍了ActiveRecord中的基本映射,对于关联映射会在后续文章中通过一些具体的实例来说明。

主要内容

简单映射

1ActiveRecordAttribute

2. PrimaryKeyAttribute

3CompositeKeyAttribute

4PropertyAttribute

5FieldAttribute

 

一.ActiveRecordAttribute

每一个实体类都必须继承于基类ActiveRecordBase,并在实体类上设置特性ActiveRecordAttribute,示例代码

None.gif // 指定数据库表名
None.gif

None.gif[ActiveRecord(
" Blogs " )]
None.gif
None.gif
public   class  Blog : ActiveRecordBase
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif    
//
InBlock.gif

ExpandedBlockEnd.gif}

None.gif
None.gif
// 不指定数据库表名
None.gif

None.gif[ActiveRecord]
None.gif
None.gif
public   class  Blog : ActiveRecordBase
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif    
//
InBlock.gif

ExpandedBlockEnd.gif}

 

 

ActiveRecordAttribute 说明

属性

说明

示例

Table

指定持久化类所对应的数据库表名,如果表名与类名相同,可以省略

[ActiveRecord("Blogs")]

[ActiveRecord(Table="Blogs")]

 

Schema

指定Schema的名字

Schema="ARDemo"

Proxy

指定一个接口,在延迟装载时作为代理使用

 

DiscriminatorColumn

识别器的字段名

DiscriminatorColumn="Blog"

DiscriminatorType

识别器的字段类型

DiscriminatorType="String"

DiscriminatorValue

识别器字段的值

 

Where

指定一个附加SQLWhere子句

Where="IsPost = 0"

Lazy

指定是否延迟加载

Lazy=true|false

 

二.PrimaryKeyAttribute

在实体类中,通过PrimaryKeyAttribute来指定表的主键,示例代码

None.gif // 指定主键字段名
None.gif

None.gif[ActiveRecord()]
None.gif
None.gif
public   class  Blog : ActiveRecordBase
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif    
private int id;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif    [PrimaryKey(
"blog_id")]
InBlock.gif
InBlock.gif    
public int Id
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn id; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ id = value; }
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif
// 不指定主键字段名
None.gif

None.gif[ActiveRecord()]
None.gif
None.gif
public   class  Blog : ActiveRecordBase
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif    
private int id;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif    [PrimaryKey]
InBlock.gif
InBlock.gif    
public int Id
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn id; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ id = value; }
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

None.gif


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, SybaseHypersonicSQL的内置标识字段提供支持,生成自增的整型

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

使用另外一个相关联的对象的标识符。

 

三.CompositeKeyAttribute

如果使用组合键,需要我们自定义一个类来作为主键属性的类型。示例代码

None.gif [PrimaryKey]
None.gif
None.gif
public  MyCompositeKey ID
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
get dot.gifreturn _key; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
set dot.gif{ _key = value; }
InBlock.gif
ExpandedBlockEnd.gif}


对于组合键类,除了需要加上CompositeKey特性之外,它还需要是可序列化的,并且要求实现EqualsGetHashCode方法。ActiveRecord官方网站上提供的一个组合键的示例程序如下:

None.gif [CompositeKey, Serializable]
None.gif
None.gif
public   class  MyCompositeKey
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif    
private string _keyA;
InBlock.gif
InBlock.gif    
private string _keyB;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif    [KeyProperty]
InBlock.gif
InBlock.gif    
public virtual string KeyA
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _keyA; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _keyA = value; }
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif    [KeyProperty]
InBlock.gif
InBlock.gif    
public virtual string KeyB
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _keyB; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _keyB = value; }
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif    
public override string ToString()
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
return string.Join( ":"new string[] dot.gif{ _keyA, _keyB } );
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif    
public override bool Equals( object obj )
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
InBlock.gif        
if( obj == this ) return true;
InBlock.gif
InBlock.gif        
if( obj == null || obj.GetType() != this.GetType() ) return false;
InBlock.gif
InBlock.gif        MyCompositeKey test 
= ( MyCompositeKey ) obj;
InBlock.gif
InBlock.gif        
return ( _keyA == test.KeyA || (_keyA != null && _keyA.Equals( test.KeyA ) ) ) &&
InBlock.gif
InBlock.gif            ( _keyB 
== test.KeyB || ( _keyB != null && _keyB.Equals( test.KeyB ) ) );
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif    
public override int GetHashCode()
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
InBlock.gif        
return _keyA.GetHashCode() ^ _keyB.GetHashCode();
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

 

四.PropertyAttribute

ActiveRecord中通过PropertyAttribute来指定实体类属性与数据库中的字段映射。

None.gif [ActiveRecord()]
None.gif
None.gif
public   class  Blog : ActiveRecordBase
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif    
//不指定字段名
InBlock.gif

InBlock.gif    [Property]
InBlock.gif
InBlock.gif    
public int Name
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _name; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _name = value; }
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif 
None.gif
None.gif[ActiveRecord()]
None.gif
None.gif
public   class  Blog : ActiveRecordBase
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif    
//指定字段名
InBlock.gif

InBlock.gif    [Property(
"blog_name")]
InBlock.gif
InBlock.gif    
public int Name
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _name; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _name = value; }
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}


PropertyAttribute说明

属性

说明

示例

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

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

Insert=true|false

 

五.FieldAttribute

ActiveRecord中,允许我们直接对Field进行映射,使用FieldAttribute

None.gif [ActiveRecord()]
None.gif
None.gif
public   class  Blog : ActiveRecordBase
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif    
//不指定字段名称
InBlock.gif

InBlock.gif    [Field]
InBlock.gif
InBlock.gif    
string _name;
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif 
None.gif
None.gif[ActiveRecord()]
None.gif
None.gif
public   class  Blog : ActiveRecordBase
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif    
//指定字段名称
InBlock.gif

InBlock.gif    [Field(
"blog_name")]
InBlock.gif
InBlock.gif    
string _name;
InBlock.gif
ExpandedBlockEnd.gif}


FieldAttribute说明

属性

说明

示例

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

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

Insert=true|false

 

六.NestedAttribute

在映射的时候我们也可以用子对象来映射数据库中的字段,示例代码

None.gif [ActiveRecord]
None.gif
None.gif
public   class  Company : ActiveRecordBase
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif    
private PostalAddress _address;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif    [Nested]
InBlock.gif
InBlock.gif    
public PostalAddress Address
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _address; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _address = value; }
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif 
None.gif
None.gif
public   class  PostalAddress
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif    
private String _address;
InBlock.gif
InBlock.gif    
private String _city;
InBlock.gif
InBlock.gif    
private String _state;
InBlock.gif
InBlock.gif    
private String _zipcode;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif    
public PostalAddress()
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif    
public PostalAddress(String address, String city,
InBlock.gif
InBlock.gif        String state, String zipcode)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
InBlock.gif        _address 
= address;
InBlock.gif
InBlock.gif        _city 
= city;
InBlock.gif
InBlock.gif        _state 
= state;
InBlock.gif
InBlock.gif        _zipcode 
= zipcode;
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif    [Property]
InBlock.gif
InBlock.gif    
public String Address
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _address; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _address = value; }
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif    [Property]
InBlock.gif
InBlock.gif    
public String City
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _city; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _city = value;}
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif    [Property]
InBlock.gif
InBlock.gif    
public String State
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _state; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _state = value; }
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif    [Property]
InBlock.gif
InBlock.gif    
public String ZipCode
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _zipcode; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _zipcode = value; }
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

 

NestedAttribute说明

属性

说明

示例

Update

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

Update=true|false

Insert

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

Insert=true|false

基本的映射就介绍这么多了,剩下的还有版本(VersionAttribute),时间戳(TimestampAttribute)等映射大家可以参考相关的文档。在下篇文章中我会通过一个具体的实例介绍实现One-Many/Many-One映射。

 

参考资料

Castle的官方网站http://www.castleproject.org

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值