2008-09-09 1 views
2

У меня есть ситуация, когда я использую программное обеспечение ГИС, которое хранит информацию о объектах ГИС в отдельной таблице базы данных для каждого типа/класса объекта ГИС (дорога , river, building, sea, ...) и сохраняет таблицу метаданных, в которой хранится информация о имени класса и его таблице DB.(N) Hibernate - возможно ли динамически отображать несколько таблиц в один класс

Эти объекты ГИС разных классов совместно используют некоторые параметры, то есть описание и идентификатор. Я хотел бы представить все эти разные классы ГИС с одним общим классом C# (назовем его GisObject), чего достаточно для того, что мне нужно сделать из не-ГИС-части приложения, в которой перечислены объекты ГИС данной ГИС класс.

Проблема для меня в том, как сопоставить эти объекты с помощью NHibernate, чтобы объяснить NHibernate при создании C# GisObject получить и использовать имя таблицы в качестве параметра который будет считываться из мета-таблицы (это может быть в два шага, я могу вручную получить имя таблицы на первом шаге, а затем передать ее в NHibernate при извлечении данных GisObject).

Разве кто-то занимался подобной ситуацией, и может ли это быть вообще?

ответ

1

Чиассон @ Брайан

К сожалению, это не вариант для создания всех классов данных ГИС, поскольку классы создаются динамически в приложении. Все данные ГИС того же типа должны быть классом, но мой пользователь имеет возможность получить новый набор данных и поместить его в базу данных. Я не могу знать, перед каким классам будет работать мой пользователь в приложении. Поэтому внешняя модель сопоставления для каждого класса не работает, потому что завтра появится еще одна новая таблица базы данных и необходимость создания нового класса с новым сопоставлением.

@all Там может быть возможность написать свой собственный запрос в конфигурационном файле XML моего класса GisObject, то в классе доступа к данным выборки, что запрос с использованием

string qs = getSession().getNamedQuery(queryName); 

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

qs = qs.replace(":tablename:", tableName); 

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

0

В одном из способов это может означать объявление интерфейса IGISObject, который имеет общие свойства, объявленные на интерфейсе. Затем реализуем конкретный класс, который сопоставляется с каждой таблицей. Таким образом, они все еще будут иметь тип IGISObject.

+0

таблицы создаются динамически пользователем. когда пользователь получает новый класс данных (т. е. получает коллекцию железных дорог из какого-то источника) и хочет ввести его в приложение, создается новая таблица, и мне нужен способ доступа к новым данным, не делая отдельного сопоставления с новый стол. – zappan 2008-09-09 12:22:19

0

Вы можете посмотреть, что здесь говорит Айенде: MultiTable Entities.

Но поскольку у вас есть отдельные таблицы, я не думаю, что это сработает. Вы также можете посмотреть nhuser group

1

Похоже, что простейшей задачей здесь может быть создание абстрактного базового класса со всеми общими элементами ГИС, а затем для наследования других классов X, которые будут иметь не что иное, как необходимые отображения NHibernate. Затем я использовал шаблон Factory для создания объекта определенного типа с использованием ваших метаданных.

0

Возможно, я задал вопрос, почему вы собираетесь использовать данные ГИС непосредственно в базе данных и не используете какой API, который обычно предоставляется в качестве абстракции для вас. Если это система ESRI, есть инструменты, которые позволяют создавать статические представления базы данных в своих объектах ГИС, а затем, возможно, с этой точки может потребоваться извлечение данных.

+0

Я использую api из intergraph, и причина в том, что api не хорошо спроектирован и построен. поэтому я извлекаю свойства non-gis в классы C#, которые будут использоваться в приложении для выпадающих списков, контрольных списков и тому подобных вещей. для рендеринга карты используется api intergraph. – zappan 2008-09-10 11:01:02

0

Из документации NHibernate вы можете использовать один из inheritance mappings.

Вы также можете иметь отдельный класс для каждой таблицы, но у них все реализовать некоторые общий интерфейс

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