我的情况是我使用GIS软件将GIS对象的信息存储到每个类型/类别的GIS对象(道路,河流,建筑物,海洋......)的单独数据库表中,并保留元数据表它存储有关类名及其数据库表的信息。
不同类的那些GIS对象共享一些参数,即描述和ID。我想用一个常见的C#类代表所有这些不同的GIS类(让我们称之为GisObject),这足以满足我需要从应用程序的非GIS部分做的事情,该部分列出给定GIS的GIS对象类。
对我来说,问题是如何使用NHibernate映射这些对象,以便在创建接收的C#GisObject时向NHibernate解释,并将表名用作参数,这将从元表中读取(它可以分为两步,我可以在第一步手动获取表名,然后在拉动GisObject数据时将其传递给NHibernate。)
是否有人处理过这种情况,是否可以完成?
答案 0 :(得分:1)
这听起来最简单的事情可能是创建一个包含所有常见GIS成员的抽象基类,然后继承其他只有必要的NHibernate映射的X类。然后,我将使用Factory模式使用元数据创建特定类型的对象。
答案 1 :(得分:1)
@Brian Chiasson
不幸的是,它不是创建所有类GIS数据的选项,因为类是在应用程序中动态创建的。每个相同类型的GIS数据都应该是一个类,但我的用户可以获取新的数据集并将其放入数据库中。我无法在前面知道我的用户将在应用程序中使用哪些类。因此,前面的每类映射模型不起作用,因为明天会有另一个新的数据库表,并且需要使用新映射创建新类。
@all 可能有可能在我的GisObject类的XML配置文件中编写我自己的自定义查询,然后在数据访问类中使用
获取该查询string qs = getSession().getNamedQuery(queryName);
并使用字符串replace来注入数据库名称(通过替换一些占位符字符串),我将作为参数传递。
qs = qs.replace(":tablename:", tableName);
您对该解决方案有何看法?我知道在不受控制的环境中可能存在安全风险,其中表名将作为用户输入获取,但在这种情况下,我有一个元表,其中包含我将在之前阅读的GIS数据类的正确和有效表名调用查询以获取特定类GIS对象的数据。
答案 2 :(得分:0)
你可以做的一种方法是声明一个接口说IGisObject,它具有在接口上声明的公共属性。然后实现一个映射到每个表的具体类。这样他们仍然都是IGisObject的类型。
答案 3 :(得分:0)
你可以看看艾恩德在这里说的话:MultiTable Entities。
但是由于你有单独的表,我认为它不会起作用。 您还可以查看nhuser group
答案 4 :(得分:0)
我想我会问这个问题,为什么你直接在数据库中处理GIS数据,而不是使用通常作为抽象提供给你的API。如果这是一个ESRI系统,那么有一些工具允许您在其GIS对象中创建静态数据库视图,然后可能从那时起它可能适合数据提取。
答案 5 :(得分:0)
从NHibernate文档中,您可以使用inheritance mappings之一。
您可能还为每个表都有一个单独的类,但让它们都实现了一些通用接口