2

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

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

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

有没有人处理过这种情况,可以做到吗?

4

6 回答 6

1

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

于 2008-09-09T13:08:51.790 回答
1

@Brian Chiasson

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

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

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

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

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

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

于 2008-09-09T13:50:33.017 回答
0

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

于 2008-09-09T11:51:39.340 回答
0

您可以看看 Ayende 在这里所说的内容:MultiTable Entities

但是由于您有单独的表格,我认为它不会起作用。您还可以查看nhuuser 组

于 2008-09-09T11:59:11.647 回答
0

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

于 2008-09-10T05:34:32.763 回答
0

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

You might also have a separate class for each table, but have them all implement some common interface

于 2008-09-19T01:15:24.980 回答