程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#基礎系列:實現自己的ORM(構造我自己的ORM)(3)

C#基礎系列:實現自己的ORM(構造我自己的ORM)(3)

編輯:關於C語言

4、怎麼控制某個 字段在表中不能重復?

比如我們要控制Person.Name不能重復,如果你新 增的時候發現重復要提示。那我們也通過增加一個Attribute的形式來實現。這 個Attribute很簡單,沒有任何方法和屬性。

public class DataFIEldNotDoubleAttribute : Attribute
{
}

5、 怎樣做事務處理?

事務處理是每個底層框架都應該考慮到的問題, 在.Net中我們有兩種方式來進行事務處理,一種是使用COM+,這是最好的方法, 不過性能上比較欠缺,另外這東西配置很麻煩,當你數據庫安裝在另外一太服務 器上的時候,往往出現無法使用的問題,我曾經就被這東西折騰夠嗆,所以我干 脆就不用他了,不過還是介紹下語法,通過使用TransactionScope就可以很好的 使用com+提供的事務處理,代碼相當的簡潔,優美,只可惜啊!天使的面孔,魔 鬼的心。

public void function1()
{
  using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope (System.Transactions.TransactionScopeOption.Required))
  {
    function2();
  }
}
public void function2()
{
  using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope (System.Transactions.TransactionScopeOption.Required))
  {
    //DOSomething();
  }
}
另外一種方法就是使 用SqlTransaction:

using (SqlConnection conn = new SqlConnection(ConnectionStr))
{
  conn.Open();
   SqlTransaction trans = conn.BeginTransaction();
   //DOSomething();
  trans.Commit();
}
不過遺憾的是 這種方式不能實現事務嵌套,所以只能通過將trans作為參數進行傳遞來實現事 務處理。

經過上面一系列的修改後,我們的Person成了什麼樣子了?

[DataObjectAttribute("Person", "ID", "")]
public class Person
{
  private int _ID;
  private string _Name;
  private int _Age;
   private string _Sex;
  private Head _Head;
  private Hand _LeftHand;
  private Hand _RightHand;
   [DataFIEldAttribute("ID", true)]
  public int ID
  {
    get { return _ID; }
    set { _ID = value; }
  }
  [SubDataObjectAttribute (SubDataObjectFIEldType.Object, "Person", "Person", "Head")]
  public Head Head
  {
    get { return _Head; }
    set { _Head = value; }
  }
  [SubDataObjectAttribute (SubDataObjectFIEldType.Object, "Person", "Person", "Hand")]
  public Hand LeftHand
  {
    get { return _LeftHand; }
     set { _LeftHand = value; }
  }
   [SubDataObjectAttribute(SubDataObjectFIEldType.Object, "Person", "Person", "Hand")]
   public Hand RightHand
  {
    get { return _RightHand; }
    set { _RightHand = value; }
  }
   [DataFIEldAttribute("name", "NvarChar")]
   public string Name
  {
    get { return this._Name; }
    set { this._Name = value; }
  }
   [DataFIEldAttribute("age", "int")]
  public int Age
  {
    get { return this._Age; }
     set { this._Age = value; }
  }
  [DataFIEldAttribute ("sex", "NvarChar")]
  public string Sex
  {
    get { return this._Sex; }
    set { this._Sex = value; }
  }
}

當然了對於 Person這樣的實體類,我們完全可以自己寫代碼自動生成工具來弄,然後再做很 小的修改就可以了,這樣的工具實現簡單,我就不討論了。

好了,關於 我的MiniORM我就討論到這裡了,其它的請看代碼吧。

ORM雖然是好東西 ,但是也存在很多方面的不足,首先我們能夠做到的是將大部分的數據庫操作交 個ORM來做。另外少部分還是需要我們自己寫SQL的。單大部分的工作的分離可以 為我們節約大量的時間(也就是所謂的20/80原則,80%的教給ORM來處理,20%的 自己做,當然很好了)。另外通過將這些相同的流程教給ORM來處理,可以避免 很多的疏忽導致的失誤(比如不小心把某個Insert,Update,Delete語句弄錯了 什麼的)。

最主要的缺點當然是性能問題,特別是我的MiniORM,全部采 用反射來獲取映射規則,從而導致性能上更多的下降,不過我們了解方法以後是 很容易通過動態生成代碼,動態編譯的方式來減少這部分的性能損失的。另外某 些部分的代碼顯得有些臃腫,特別是把判斷是否Indentity這樣的代碼放 DataFieldAttribute中來處理(這個完全可以象DataFIEldNotDoubleAttribute 一分開處理的樣)等等。

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