Реализация DAL в .NET с DB-first - PullRequest
0 голосов
/ 25 июля 2011

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

1 Ответ

1 голос
/ 26 июля 2011

Я бы посоветовал вам использовать .NET ORM.Подробнее о выборе ORM можно узнать здесь:

NHibernate, Entity Framework, активные записи или linq2sql

Выполнение команды «SELECT * FROM Person WHERE FirstName = @FirstName»использование ORM не будет заметно медленнее, и ваша скорость разработки может быть намного выше.

...