C# проект с поддержкой нескольких бд?

Знакомлюсь с C# и столкнулся со следующей задачей, которую не знаю как решить.


Есть много разных Обьектов, каждый с конечным набором полей, которые заранее известны. Нужно организовать поддержку хранения каждого такого Обьекта в разных базах данных (oracle, mysql, firebird, interbase и postgres). В них он может храниться по разному, вплоть до того, что разные его части будут находиться в разных таблицах, названия полей и таблиц будут отличаться.

(поддержка хранения — в том плане, что в софте должна быть возможность считывать записи из выбранной бд, изменять, удалять их)


Может немного сумбурно задаю вопрос, по ходу дела, если нужно, уточню. Но, может ли кто посоветовать Right Way, Best Practice, подсказать как правильно и красиво это можно реализовать?
  • Вопрос задан
  • 6005 просмотров
Пригласить эксперта
Ответы на вопрос 3
@mayorovp
Для Entity Framework эта ситуация — штатная, разве что визуальный редактор ее не поддерживает. Создаем одну концептуальную модель, создаем по модели хранения на каждую БД, и для каждой БД создаем свое отображение модели хранения на концептуальную.
Ответ написан
Shedal
@Shedal
Если использовать ORM, то ответ очевиден. Вы будете использовать встроенные в них средства, а также бороться с их ограничениями.

В принципе же, ответ таков: выделять классический DAL — Data Access Layer. Для этого существует много стандартных паттернов. Например:

Самое простое — Data Mapper. Создаёте интерфейс для вашей сущности:

interface ICarData
{
  void Insert(Car car);
  Car GetById(int id);
  // и т.д.
}

Затем наследуете от этого интерфейса классы, его реализующие — e.g. MySqlCarData, MongDbCarData.
Отдельная задача здесь — определение, какой класс использовать. Самый простой способ — задавать имя класса через конфигурационный файл и создавать объект нужного класса простой фабрикой (switch(className) {… } ). Более красиво — использовать IoC/DI контейнер.
Ответ написан
Комментировать
Denisio
@Denisio
Обычно используют Object to Relation Mapping (ORM) Frameworks. Мы используем NHibernate (для работы с MSSQL, SQLite и Mysql). Настраивается с помощью адаптеров и если не использовать прямые запросы к БД — то LINQ over NHibernate вполне себе работает с этими БД прозрачно для программиста. Для Interbase и ещо вагона разных БД тоже есть свои адаптеры.

В случае «разные части в разных таблицах» — необходима прослойка data access layer, например для каждого случая хранения. Этот слой будет возвращать набор нужных данных по указанному критерию, изолируя специфику доступа от программиста и делая доступ к БД более прозрачным.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы