在.NET中使用DB-first实现DAL

问题描述:

我正在研究一个具有大约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. 高性能

我会建议你使用.NET ORM。您可以了解更多关于此选择的ORM:

NHibernate, Entity Framework, active records or linq2sql

执行“SELECT * FROM WHERE人名字= @firstName”不会是使用ORM明显慢了,你的发展速度有可能成为潜在的快多了。