ORM並不能完成所有的事情,有些數據庫訪問還是需要基於關係來進行,對於那些不提供基於關係進行數據訪問操作的純ORM框架,我認爲是不明智的。在DataRabbit中,基於ORM的訪問和基於關係進行數據訪問各佔了一半的天空,這使得我們在無法用ORM達成的地方,可以轉向使用基於關係的訪問器來達成。DataRabbit.Relation命名空間下的類和接口用於提供基於關係的數據庫訪問操作,主要包括:針對數據庫的Relation訪問器(IRelationAccesser)、針對Table的Relation訪問器(ITableAccesser)和針對存儲過程的訪問器(ISPAccesser),本文先介紹 ITableAccesser。
同所有DataRabbit中的其它訪問器一樣,ITableAccesser也繼承自ITransactionAccesser,它用於針對一個特定的表進行基於關係的數據訪問。我們可以從DataRabbit的入口點IDataAccesser中獲取ITableAccesser引用,比如,我們要得到針對Student表的ITableAccesser,可以這樣做:
同ORM訪問器一樣,所有基於關係的訪問器都向使用者屏蔽了地層的IDbCommand、IDbConnection等對象,使用者不必再關心打開連接、執行命令、關閉連接等繁瑣的操作,只需要將sql語句交給訪問器執行就可以了。比如,我們要刪除所有年齡大於30的student,使用ITableAccesser可以這麼做:
stuTableAccesser.Delete(string.Format("where {0} > '30'" ,Student._Age));
IDataAccesser接口相對簡單,我們來看看它的全貌,之後你就知道該接口中各方法的含義了:
{
#region TableName
/// <summary>
/// TableName 目標表名稱
/// </summary>
string TableName { get; }
#endregion
#region CommitData
/// <summary>
/// CommitData 提交DataTable中的changes到數據庫
/// </summary>
void CommitData(DataTable dt);
#endregion
#region Delete
/// <summary>
/// Delete 刪除目標表中所有滿足where條件的記錄
/// </summary>
void Delete(string where);
#endregion
#region Clear
/// <summary>
/// Clear 清空目標表
/// </summary>
void Clear();
#endregion
#region Insert
/// <summary>
/// Insert 將row存放到數據庫中
/// </summary>
void Insert(DataRow row);
#endregion
#region Get
/// <summary>
/// Get 獲取滿足條件的DataSet
/// </summary>
DataSet Get(string where);
/// <summary>
/// GetOne 返回滿足where條件的第一條記錄
/// </summary>
DataRow GetOne(string where);
#endregion
#region no transaction
/// <summary>
/// GetRecordsCount 獲取目標表中滿足where條件的記錄總數
/// </summary>
int GetRecordsCount(string where);
/// <summary>
/// NewRow 返回一個與目標表大綱完全一致的DataRow
/// </summary>
DataRow NewRow();
/// <summary>
/// GetEmptyTable 獲取一個空的DataTable,該DataTable反映了目標表的結構
/// </summary>
/// <returns></returns>
DataTable GetEmptyTable();
#endregion
}