我遇到的情况是,我使用 GIS 软件,该软件将 GIS 对象的信息存储到每种类型/类别的 GIS 对象(道路、河流、建筑物、海洋等)的单独数据库表中,并保留其存储的元数据表有关类名称及其数据库表的信息。

不同类的 GIS 对象共享一些参数,即描述和 ID。我想用一个通用的 C# 类(我们称之为 GisObject)来表示所有这些不同的 GIS 类,这足以满足我需要从应用程序的非 GIS 部分执行的操作,该部分列出了给定 GIS 的 GIS 对象班级。

对我来说问题是如何使用 NHibernate 映射这些对象,以便在创建 C# GisObject 来接收和解释时向 NHibernate 解释 使用表名作为参数 将从元表中读取(可以分两步,我可以在第一步中手动获取表名,然后在拉取 GisObject 数据时将其传递给 NHibernate)。

有没有人处理过这种情况,可以解决吗?

有帮助吗?

解决方案 2

@布莱恩·奇亚森

遗憾的是,无法创建所有 GIS 数据类,因为类是在应用程序中动态创建的。相同类型的每个 GIS 数据都应该是一个类,但我的用户可以获取新的数据集并将其放入数据库中。我无法知道我的用户将在应用程序中拥有哪些类。因此,前面的每类映射模型不起作用,因为明天将有另一个新的数据库表,并且需要使用新映射创建新类。

@all可能有可能在我的gisobject类的XML配置文件中编写我自己的自定义查询,然后在数据访问类中使用该查询来获取该查询

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

并使用字符串替换来注入数据库名称(通过替换一些占位符字符串),我将其作为参数传递。

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

您对该解决方案有何看法?我知道在不受控制的环境中可能存在安全风险,其中表名称将作为用户输入获取,但在这种情况下,我有一个元表,其中包含我之前将阅读的 GIS 数据类的正确且有效的表名称调用查询来获取特定类 GIS 对象的数据。

其他提示

听起来这里要做的最简单的事情可能是创建一个包含所有常见 GIS 成员的抽象基类,然后继承其他 X 类,这些类除了必要的 NHibernate 映射外什么也没有。然后,我将使用工厂模式使用您的元数据创建特定类型的对象。

一种方法是声明一个接口(例如 IGisObject),该接口具有在接口上声明的公共属性。然后实现一个映射到每个表的具体类。这样它们仍然是 IGisObject 类型。

你可以看看 Ayende 在这里说的话: 多表实体.

但由于你有单独的桌子,我认为它不会起作用。您还可以查看 恩胡瑟集团

我想我会问为什么你要直接在数据库中获取 GIS 数据,而不使用通常为你提供的抽象 API。如果这是一个 ESRI 系统,那么有一些工具允许您在其 GIS 对象中创建静态数据库视图,然后也许从那时起它可能适合数据提取。

从 NHibernate 文档中,您可以使用其中之一 继承映射.

您可能还为每个表都有一个单独的类,但让它们都实现一些通用接口

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top