4、怎麼控制某個 字段在表中不能重復?
比如我們要控制Person.Name不能重復,如果你新 增的時候發現重復要提示。那我們也通過增加一個Attribute的形式來實現。這 個Attribute很簡單,沒有任何方法和屬性。
public class DataFIEldNotDoubleAttribute : Attribute
{
}
5、 怎樣做事務處理?
事務處理是每個底層框架都應該考慮到的問題, 在.Net中我們有兩種方式來進行事務處理,一種是使用COM+,這是最好的方法, 不過性能上比較欠缺,另外這東西配置很麻煩,當你數據庫安裝在另外一太服務 器上的時候,往往出現無法使用的問題,我曾經就被這東西折騰夠嗆,所以我干 脆就不用他了,不過還是介紹下語法,通過使用TransactionScope就可以很好的 使用com+提供的事務處理,代碼相當的簡潔,優美,只可惜啊!天使的面孔,魔 鬼的心。
public void function1()
另外一種方法就是使 用SqlTransaction:
{
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();
}
}
using (SqlConnection conn = new SqlConnection(ConnectionStr))
不過遺憾的是 這種方式不能實現事務嵌套,所以只能通過將trans作為參數進行傳遞來實現事 務處理。
{
conn.Open();
SqlTransaction trans = conn.BeginTransaction();
//DOSomething();
trans.Commit();
}
經過上面一系列的修改後,我們的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 一分開處理的樣)等等。