程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Castle ActiveRecord學習實踐(3) 映射基礎

Castle ActiveRecord學習實踐(3) 映射基礎

編輯:關於.NET

主要內容

簡單映射

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
{
  //指定字段名稱
  [Field("blog_name")]
  string _name;
}
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 表明在用於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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved