Я пытаюсь выбрать лучшую стратегию доступа к базе данных. Я понимаю, что это общий вопрос и на него нет однозначного хорошего ответа, но я дам несколько рекомендаций относительно того, что я ищу. Последние несколько лет мы использовали нашу собственную структуру персистентности, которая, хотя и ограничена, тоже работала. Однако он требует серьезных улучшений, и мне интересно, следует ли мне пойти по этому пути или использовать одну из существующих фреймворков. Критерии, которые я ищу, в порядке важности:
Клиентский код должен работать с чистыми объектами, ширина которых не зависит от базы данных. При использовании нашего пользовательского фреймворка клиентский код выглядит так:
SessionManager session = новый SessionManager (); Порядок заказа = session.CreateEntity (); order.Date = DateTime.Now; // Устанавливаем другие свойства OrderDetail detail = order.AddOrderDetail (); detail.Product = product; // Другие свойства
// Зафиксируем все изменения сейчас session.Commit ();
Должен быть максимально простым и не «слишком гибким». Нам нужен единственный способ делать большинство вещей.
- Должен иметь хорошую поддержку объектно-ориентированного программирования. Должен обрабатывать отношения «один ко многим» и «многие ко многим», должен обрабатывать наследование, поддерживать отложенную загрузку.
- Предпочтительно, чтобы конфигурация была основана на XML.
Исходя из моих текущих знаний, я вижу следующие варианты:
- Улучшить нашу текущую структуру - проблема в том, что для этого нужно приложить немало усилий.
- ADO.NET Entity Framework - плохо разбираюсь в этом, но кажется слишком сложным и имеет плохие отзывы.
- LINQ to SQL - не имеет хорошей обработки объектно-ориентированной практики.
- nHibernate - кажется хорошим вариантом, но некоторые пользователи сообщают о слишком большом количестве архаичных ошибок.
- SubSonic - из краткого вступления кажется слишком гибким. Я не хочу этого.
Что вы предложите?
РЕДАКТИРОВАТЬ:
Спасибо, Крейг, за подробный ответ. Я думаю, что это поможет больше, если я расскажу больше о нашей кастомной структуре. Ищу нечто подобное. Вот как работает наш кастомный фреймворк:
- Он основан на DataSet, поэтому первое, что вы делаете, это настраиваете DataSets и пишете туда нужные вам запросы.
- Вы создаете файл конфигурации XML, который определяет, как таблицы DataSet сопоставляются с объектами, а также задают связи между ними (поддержка всех типов ассоциаций). 3. Пользовательский инструмент проанализирует конфигурацию XML и сгенерирует необходимый код. 4. Сгенерированные классы наследуют от общего базового класса.
Чтобы быть совместимой с нашей структурой, база данных должна соответствовать следующим критериям:
- Каждая таблица должна иметь единственный столбец в качестве первичного ключа.
- Все таблицы должны иметь первичный ключ того же типа данных, сгенерированный на клиенте.
- Для обработки наследования поддерживается только наследование одной таблицы. Также XML-файл почти всегда предлагает единственный способ чего-то достичь.
Сейчас мы хотим поддержать:
- Удалите зависимость от DataSets. Код SQL должен генерироваться автоматически, но фреймворк НЕ должен генерировать схему. Я хочу вручную управлять схемой БД.
- Более надежная поддержка иерархий наследования.
- Дополнительная интеграция с LINQ.
Надеюсь, теперь стало понятнее, что я ищу.