Реализация DAL в .NET с DB-PRIRST
Вопрос
Я работаю над проектом, который имеет БД из около 30 таблиц и около 100 сохраненных процедур (MSSQL).
Весь код DAL реализован с использованием блока приложений доступа к данным. Я считаю, что этот подход занимает слишком много времени, даже если мне просто нужно добавить новое поле в существующую таблицу. Во -первых, я должен обновить сценарии DB, затем я должен проверить обертки 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];
Я твердо верю, что эта идея действительно ужасна, но я не совсем уверен, каков правильный подход. Я абсолютно уверен, что я хотел бы видеть, по крайней мере, напечатанные объекты вместо данных и коллекций этих объектов вместо данных. Я также уверен, что не хочу самостоятельно реализовать все эти вещи.
Пару дней назад я нашел 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, и он кажется очень медленным, хотя мне очень нравятся его функции.
Какое здесь правильное решение? Приоритеты:
- Легко отразить изменения структуры БД
- Напечатали данные вместо
int.Parse(row[0][3].ToString())
- Высокая производительность
Решение
Я бы предложил вам использовать .NET ORM. Вы можете узнать больше о выборе ORM здесь:
Nhibernate, Entity Framework, Active Records или Linq2sql
Выполнение «SELECT * из человека, где FirstName = @FirstName» не будет заметно медленнее, используя ORM, и ваша скорость развития может быть намного быстрее.