在.NET中使用DB-first实现DAL
问题描述:
我正在研究一个具有大约30个表和大约100个存储过程(MSSQL)的DB的项目。在.NET中使用DB-first实现DAL
所有的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,这种方法是抽象的,足以让我做我想要什么,而不是我现在有,但在另一边,它仍然是相当低级。
我也试过流利的NHibernate,它似乎很慢,但我真的很喜欢它的功能。
什么是正确的解决方案?的重点是:
- 容易反映DB结构的变化
- 类型的数据,而不是
int.Parse(row[0][3].ToString())
- 高性能
答
我会建议你使用.NET ORM。您可以了解更多关于此选择的ORM:
NHibernate, Entity Framework, active records or linq2sql
执行“SELECT * FROM WHERE人名字= @firstName”不会是使用ORM明显慢了,你的发展速度有可能成为潜在的快多了。