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

时间:2011-07-25 19:34:32

标签: .net orm bltoolkit

我正在开发一个项目,其数据库大约有30个表和大约100个存储过程(MSSQL)。

  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,但这种方法是抽象的 - 足以让我想要它而不是我现在所拥有的,但另一方面,它仍然是相当低级的。

    < / LI>
  4. 我也试过Fluent NHibernate,虽然我非常喜欢它的功能,但它看起来确实很慢。

  5. 这里的解决方案是什么?优先事项是:

    1. 易于反映数据库结构的变化
    2. 键入数据而非int.Parse(row[0][3].ToString())
    3. 高性能

1 个答案:

答案 0 :(得分:1)

我建议您使用.NET ORM。您可以在此处了解有关选择ORM的更多信息:

NHibernate, Entity Framework, active records or linq2sql

使用ORM执行“SELECT * FROM Person WHERE FirstName = @FirstName”并不会明显变慢,并且您的开发速度可能会快得多。