(N) Hibernate - возможно ли динамическое сопоставление нескольких таблиц с одним классом - PullRequest
2 голосов
/ 09 сентября 2008

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

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

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

Кто-нибудь имел дело с такой ситуацией, и можно ли это вообще сделать?

Ответы [ 6 ]

1 голос
/ 09 сентября 2008

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

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

@ все Может быть возможность написать собственный запрос в XML-файле конфигурации моего класса GisObject, а затем в классе доступа к данным, извлекая этот запрос с помощью

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

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

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

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

1 голос
/ 09 сентября 2008

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

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

Из документации NHibernate вы можете использовать одно из отображений наследования .

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

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

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

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

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

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

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

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

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