Как я могу использовать ORM для базы данных, схема которой неизвестна до времени выполнения? - PullRequest
3 голосов
/ 26 сентября 2008

Я пытаюсь использовать ORM, учитывая следующие требования:

1) Использование .NET Framework (последняя версия в порядке)
2) Должен быть в состоянии использовать Sybase, Oracle, MSSQL взаимозаменяемо
3) Схема в основном статическая, НО есть динамические части.

Я немного знаком с SubSonic и NHibernate, но не очень хорошо.
У меня появляется ноющее чувство, что ORM может делать то, что я хочу, но я не знаю, как использовать это в данный момент.

SubSonic, вероятно, не оптимален, поскольку в настоящее время он не поддерживает Sybase, и написание моего собственного провайдера для него сейчас выходит за рамки моих возможностей и возможностей.

Для # 3 (выше) есть пара таблиц метаданных, которые описывают таблицы, которые поставщики могут "прикреплять" к существующей базе данных.
Давайте назовем эти мета-таблицы и мета-поля .

Существует базовая статическая схема, с которой ORM (NHibernate ATM) хорошо справляется.
Однако поставщик может добавить таблицу в базу данных (физически), если он также добавляет данные в таблицы метаданных для описания своей структуры.

Что я действительно хотел бы, так это чтобы я мог как-то «кормить» ORM этими метаданными (таким образом, чтобы он понимал) и иметь их в этот момент, чтобы я мог манипулировать данными.

Моя основная цель состоит в том, чтобы уменьшить объем построения обобщенных операторов SQL, которые я должен выполнять на этих динамических таблицах.
Я также хотел бы не беспокоиться о различиях в отправке SQL в Sybase, Oracle или MSSQL.

Моя основная проблема заключается в том, что у меня нет возможности сообщить ORM о динамических таблицах до времени выполнения, когда у меня будет доступ к метаданным

Редактировать : Пример использования может быть похож на тот, который обрисован в общих чертах здесь :

IDataReader rdr = новый запрос ("DynamicTable1"). WHERE ("ArbitraryId", 2) .ExecuteReader ();

(Однако не похоже, что SubSonic будет работать, так как нет поставщика Sybase (см. Выше)

Ответы [ 5 ]

1 голос
/ 12 декабря 2008

Согласно этому блогу вы можете использовать NHibernate с динамическим отображением . Хотя это требует небольшой настройки ...

1 голос
/ 14 октября 2008

Мы частично использовали NHibernate, однако мы остановили проект, поскольку он не обеспечил нам окупаемость инвестиций, которую мы хотели. Мы закончили тем, что написали наш собственный слой ORM / SQL, который работал очень хорошо (работал, так как я там больше не работаю, полагаю, он все еще работает).

Наша система использовала проект с открытым исходным кодом для генерации SQL (больше не помню названия), и мы построили все наши запросы на нашем собственном языке на основе Xml (Query Markup Language - QML). Затем мы можем создать xmlDocument с использованием select, wheres, groups и т. Д., А затем отправить его в SqlEngine, который превратит его в оператор Sql и выполнит его. Мы обсуждаем, но никогда не внедряем кеш во всем этом. Это позволило бы нам кэшировать Qmls для часто используемых запросов.

0 голосов
/ 19 октября 2008

Рассматривали ли вы использование ADO.NET Entity Framework?

MSDN: LINQ to Entities

Это позволяет отображать таблицы базы данных в объектную модель таким образом, что вы можете кодировать, не думая о том, какой поставщик базы данных используется, и не беспокоясь о незначительных изменениях, внесенных администратором баз данных в реальные таблицы. Сопоставление хранится в файлах конфигурации, которые можно изменять при изменении таблиц БД без перекомпиляции.

Кроме того, используя LINQ to Entities, вы можете создавать запросы OO-способом, поэтому вы не пишете реальные строки SQL-запросов.

0 голосов
/ 26 сентября 2008

IDataReader не сопоставляет ничего с известным вам объектом. Поэтому ваш пример должен быть написан с использованием классического построителя запросов.

0 голосов
/ 26 сентября 2008

Я немного озадачен тем, как будет использоваться форма во время выполнения? Если ORM будет динамически создавать что-то во время выполнения, как код времени выполнения узнает, что динамически сделал orm?

«Позвольте мне в этот момент разрешить мне манипулировать данными» - Что такое манипулирование данными?

Я могу что-то упустить здесь, и я прошу прощения, если это так. (Я действительно использовал подход снизу вверх с ORM)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...