Вопрос

Я работаю над проектом, который имеет БД из около 30 таблиц и около 100 сохраненных процедур (MSSQL).

  1. Весь код DAL реализован с использованием блока приложений доступа к данным. Я считаю, что этот подход занимает слишком много времени, даже если мне просто нужно добавить новое поле в существующую таблицу. Во -первых, я должен обновить сценарии DB, затем я должен проверить обертки 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];
    

    Я твердо верю, что эта идея действительно ужасна, но я не совсем уверен, каков правильный подход. Я абсолютно уверен, что я хотел бы видеть, по крайней мере, напечатанные объекты вместо данных и коллекций этих объектов вместо данных. Я также уверен, что не хочу самостоятельно реализовать все эти вещи.

  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. Я также пробовал беглый nhibernate, и он кажется очень медленным, хотя мне очень нравятся его функции.

Какое здесь правильное решение? Приоритеты:

  1. Легко отразить изменения структуры БД
  2. Напечатали данные вместо int.Parse(row[0][3].ToString())
  3. Высокая производительность
Это было полезно?

Решение

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

Nhibernate, Entity Framework, Active Records или Linq2sql

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top