我正在开发一个项目,该项目的数据库包含大约 30 个表和大约 100 个存储过程 (MSSQL)。
所有 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,但这种方法对于我来说已经足够抽象,让我想要它而不是我目前拥有的东西,但另一方面,它仍然是相当低级的。
我也尝试过 Fluent NHibernate,虽然我真的很喜欢它的功能,但它似乎真的很慢。
什么是正确的解决方案?优先事项是:
- 易于反映DB结构变化
- 键入数据而不是
int.Parse(row[0][3].ToString())
- 高性能