0

我正在开发一个项目,该项目的数据库包含大约 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,但这种方法对于我来说已经足够抽象,让我想要它而不是我目前拥有的东西,但另一方面,它仍然是相当低级的。

  4. 我也尝试过 Fluent NHibernate,虽然我真的很喜欢它的功能,但它似乎真的很慢。

什么是正确的解决方案?优先事项是:

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

1 回答 1

1

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

NHibernate、实体框架、活动记录或 linq2sql

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

于 2011-07-26T09:52:30.043 回答