主要內容
簡單映射
1.ActiveRecordAttribute
2. PrimaryKeyAttribute
3.CompositeKeyAttribute
4.PropertyAttribute
5.FieldAttribute
一.ActiveRecordAttribute
每一個實體類都必須繼承於基類ActiveRecordBase,並在實體類上設置特性ActiveRecordAttribute,示例代碼
//指定數據庫表名
[ActiveRecord("Blogs")]
public class Blog : ActiveRecordBase
{
//
}
//不指定數據庫表名
[ActiveRecord]
public class Blog : ActiveRecordBase
{
//
}
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
在實體類中,通過PrimaryKeyAttribute來指定表的主鍵,示例代碼
//指定主鍵字段名
[ActiveRecord()]
public class Blog : ActiveRecordBase
{
private int id;
[PrimaryKey("blog_id")]
public int Id
{
get { return id; }
set { id = value; }
}
}
//不指定主鍵字段名
[ActiveRecord()]
public class Blog : ActiveRecordBase
{
private int id;
[PrimaryKey]
public int Id
{
get { return id; }
set { id = value; }
}
}
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 使用另外一個相關聯的對象的標識符。
三.CompositeKeyAttribute
如果使用組合鍵,需要我們自定義一個類來作為主鍵屬性的類型。示例代碼
[PrimaryKey]
public MyCompositeKey ID
{
get { return _key; }
set { _key = value; }
}
對於組合鍵類,除了需要加上CompositeKey特性之外,它還需要是可序列化的,並且要求實現Equals和GetHashCode方法。ActiveRecord官方網站上提供的一個組合鍵的示例程序如下:
[CompositeKey, Serializable]
public class MyCompositeKey
{
private string _keyA;
private string _keyB;
[KeyProperty]
public virtual string KeyA
{
get { return _keyA; }
set { _keyA = value; }
}
[KeyProperty]
public virtual string KeyB
{
get { return _keyB; }
set { _keyB = value; }
}
public override string ToString()
{
return string.Join( ":", new string[] { _keyA, _keyB } );
}
public override bool Equals( object obj )
{
if( obj == this ) return true;
if( obj == null || obj.GetType() != this.GetType() ) return false;
MyCompositeKey test = ( MyCompositeKey ) obj;
return ( _keyA == test.KeyA || (_keyA != null && _keyA.Equals( test.KeyA ) ) ) &&
( _keyB == test.KeyB || ( _keyB != null && _keyB.Equals( test.KeyB ) ) );
}
public override int GetHashCode()
{
return _keyA.GetHashCode() ^ _keyB.GetHashCode();
}
}
四.PropertyAttribute
在ActiveRecord中通過PropertyAttribute來指定實體類屬性與數據庫中的字段映射。
[ActiveRecord()]
public class Blog : ActiveRecordBase
{
//不指定字段名
[Property]
public int Name
{
get { return _name; }
set { _name = value; }
}
}
[ActiveRecord()]
public class Blog : ActiveRecordBase
{
//指定字段名
[Property("blog_name")]
public int Name
{
get { return _name; }
set { _name = value; }
}
}
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 表明在用於INSERT的SQL語句中是否包含這個字段。默認為true Insert=true|false
五.FieldAttribute
在ActiveRecord中,允許我們直接對Field進行映射,使用FieldAttribute
[ActiveRecord()]
publicclassBlog:ActiveRecordBase
{
//不指定字段名稱
[Field]
string _name;
}
[ActiveRecord()]
public class Blog : ActiveRecordBase
FieldAttribute說明
{
//指定字段名稱
[Field("blog_name")]
string _name;
}
屬性 說明 示例 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
六.NestedAttribute
在映射的時候我們也可以用子對象來映射數據庫中的字段,示例代碼
[ActiveRecord]
public class Company : ActiveRecordBase
{
private PostalAddress _address;
[Nested]
public PostalAddress Address
{
get { return _address; }
set { _address = value; }
}
}
public class PostalAddress
{
private String _address;
private String _city;
private String _state;
private String _zipcode;
public PostalAddress()
{
}
public PostalAddress(String address, String city,
String state, String zipcode)
{
_address = address;
_city = city;
_state = state;
_zipcode = zipcode;
}
[Property]
public String Address
{
get { return _address; }
set { _address = value; }
}
[Property]
public String City
{
get { return _city; }
set { _city = value;}
}
[Property]
public String State
{
get { return _state; }
set { _state = value; }
}
[Property]
public String ZipCode
{
get { return _zipcode; }
set { _zipcode = value; }
}
}
NestedAttribute說明
屬性 說明 示例 Update 表明在用於UPDATE 的SQL語句中是否包含這個字段。默認為true Update=true|false Insert 表明在用於INSERT的SQL語句中是否包含這個字段。默認為true Insert=true|false
基本的映射就介紹這麼多了,剩下的還有版本(VersionAttribute),時間戳(TimestampAttribute)等映射大家可以參考相關的文檔。在下篇文章中我會通過一個具體的實例介紹實現One-Many/Many-One映射。
參考資料
Castle的官方網站http://www.castleproject.org