2011-07-25 21 views
0

我正在研究一個具有大約30個表和大約100個存儲過程(MSSQL)的DB的項目。在.NET中使用DB-first實現DAL

  1. 所有的DAL代碼都是使用數據訪問應用程序塊實現的。我相信,即使我只需要將新字段添加到現有表中,該方法也需要很長時間。首先,我必須更新數據庫腳本,然後我必須檢查代碼中的SP包裝和/或查詢以反映我的更改。

  2. 大多數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。我也確定我不想自己實現所有這些東西。

  3. 幾天前,我發現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,這種方法是抽象的,足以讓我做我想要什麼,而不是我現在有,但在另一邊,它仍然是相當低級。

  4. 我也試過流利的NHibernate,它似乎很慢,但我真的很喜歡它的功能。

什麼是正確的解決方案?的重點是:

  1. 容易反映DB結構的變化
  2. 類型的數據,而不是int.Parse(row[0][3].ToString())
  3. 高性能

回答