Я работаю над проектом, у которого в БД около 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, и он кажется очень медленным, хотя мне действительно нравятся его функции.
Какое здесь правильное решение?Приоритеты:
- Легко отражать изменения структуры БД
- Типизированные данные вместо
int.Parse(row[0][3].ToString())
- Высокая производительность