我正在研究一個具有大約30個表和大約100個存儲過程(MSSQL)的DB的項目。在.NET中使用DB-first實現DAL
所有的DAL代碼都是使用數據訪問應用程序塊實現的。我相信,即使我只需要將新字段添加到現有表中,該方法也需要很長時間。首先,我必須更新數據庫腳本,然後我必須檢查代碼中的SP包裝和/或查詢以反映我的更改。
大多數DAL(90%)的是這樣的:
// "idiom #1" for my project public static DataSet GetSomeData(int a, int b) { return SqlHelper.ExecuteDataSet( connection, "select x, y from tab1 where a = " + a.ToString() + " and b = " + b.ToString()); }
然後,當這是從什麼地方稱爲:
// "idiom #2" var ds = DAL.GetSomeData(123, 456); var t = ds.Tables[0]; var x = t.Rows[0][0]; var y = t.Rows[0][1];
我堅信,這種想法實在是太可怕了,但我不確定正確的方法是什麼。我絕對相信,我希望看到的至少是類型化對象,而不是DataRows和這些對象的集合,而不是DataTables。我也確定我不想自己實現所有這些東西。
幾天前,我發現BLToolkit似乎可以解決這個問題,但我不確定使用它是否好主意,因爲我沒有足夠的經驗。我真的很喜歡這個例子:
public abstract class PersonAccessor : DataAccessor { [SqlText(@"SELECT * FROM Person WHERE FirstName = @firstName")] public abstract List<Person> GetPersonListByFirstName(string @firstName); [SprocName("sp_GetPersonListByLastName")] public abstract List<Person> GetPersonListByLastName(string @lastName); ...
雖然我不能把它的ORM,這種方法是抽象的,足以讓我做我想要什麼,而不是我現在有,但在另一邊,它仍然是相當低級。
我也試過流利的NHibernate,它似乎很慢,但我真的很喜歡它的功能。
什麼是正確的解決方案?的重點是:
- 容易反映DB結構的變化
- 類型的數據,而不是
int.Parse(row[0][3].ToString())
- 高性能