2008-09-25 1 views
3

Я пытаюсь использовать ОРМ с учетом следующих требований:Как я могу использовать ORM для базы данных, чья схема неизвестна до времени выполнения?

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

Я немного знаком с SubSonic и NHibernate, но не глубоко.
Я чувствую, что ОРМ может делать то, что я хочу, но я не знаю, как использовать его в данный момент.

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

Для № 3 (см. Выше) существует пара таблиц метаданных, которые описывают таблицы, которые поставщики могут «сшивать» с существующей базой данных.
Назовем их MetaTables и MetaFields.

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

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

My primary Цель заключается в том, чтобы уменьшить количество генерируемых SQL-выражений, которые я должен выполнить для этих динамических таблиц.
Я также хотел бы не беспокоиться о различиях в отправке SQL в Sybase, Oracle или MSSQL.

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

Edit: Пример из использование может быть как outlined here:

IDataReader rdr = новый запрос («DynamicTable1»). ГДЕ («Арбитраж», 2) .ExecuteReader();

(Тем не менее, это не выглядит как SubSonic будет работать, так как нет поставщик Sybase (см выше)

ответ

0

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

«иметь его в тот момент, позвольте мне манипулировать данными» -? что манипулирует данные

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

+0

отредактировал выше, спасибо. Извините, возможно, «манипулирование данными» является немногословным .. Я просто имел в виду регулярный CRUD (в какой бы форме я его не смог получить) – 2008-09-25 22:17:05

+0

AHh, теперь я понимаю, что вы имеете в виду, и как вы планируете его использовать. Я использую LLBLGen совсем немного, и он генерирует классы на основе БД. Однако он поставляется с очень сложным динамическим механизмом запросов. Это тоже сибаза. Дайте мне немного, и я увижу, могу ли я написать код и вставить его. кто знает .. – mattlant 2008-09-25 22:26:40

+0

Извините, но я не смог получить ничего, кроме строк SQL Text. Я не знаю, требуется ли вам больше абстракции, чем это. – mattlant 2008-09-25 22:56:58

0

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

1

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

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

1

Вы изучали использование инфраструктуры Entity Framework ADO.NET?

MSDN: LINQ to Entities

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

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

Смежные вопросы