Pergunta

Eu tenho a situação em que uso um software GIS que armazena as informações sobre objetos GIS em uma tabela de banco de dados separada para cada tipo/classe de objeto GIS (estrada, rio, edifício, mar, ...) e mantém a tabela de metadados na qual armazena informações sobre o nome da classe e sua tabela de banco de dados.

Esses objetos GIS de diferentes classes compartilham alguns parâmetros, ou seja,Descrição e ID.Eu gostaria de representar todas essas classes GIS diferentes com uma classe C# comum (vamos chamá-la de GisObject), que é suficiente para o que preciso fazer na parte não GIS do aplicativo que lista os objetos GIS do GIS fornecido. aula.

O problema para mim é como mapear esses objetos usando o NHibernate para explicar ao NHibernate ao criar um GisObject C# para receber e use o nome da tabela como parâmetro que será lido na meta-tabela (pode ser em duas etapas, posso buscar manualmente o nome da tabela na primeira etapa e depois passá-lo para o NHibernate ao extrair dados do GisObject).

Alguém já lidou com esse tipo de situação e isso pode ser feito?

Foi útil?

Solução 2

@Brian Chiasson

Infelizmente, não é uma opção criar todas as classes de dados GIS porque as classes são criadas dinamicamente na aplicação.Todos os dados GIS do mesmo tipo devem ser uma classe, mas meu usuário tem a possibilidade de obter um novo conjunto de dados e colocá-los no banco de dados.Não consigo saber de antemão quais classes meu usuário terá na aplicação.Portanto, o modelo de mapeamento por classe na frente não funciona porque amanhã haverá outra nova tabela de banco de dados e será necessário criar uma nova classe com novo mapeamento.

@All, pode haver a possibilidade de escrever minha própria consulta personalizada no arquivo de configuração XML da minha classe GisObject, então na classe de acesso a dados buscando essa consulta usando o

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

e use a string replace para injetar o nome do banco de dados (substituindo alguma string de espaço reservado) que passarei como parâmetro.

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

Como você se sente em relação a essa solução?Eu sei que pode ser um risco de segurança em um ambiente não controlado onde o nome da tabela seria obtido como entrada do usuário, mas neste caso, tenho uma metatabela contendo nomes de tabelas corretos e válidos para as classes de dados GIS que irei ler antes chamar a consulta para buscar dados para a classe específica de objetos GIS.

Outras dicas

Parece que a coisa mais simples a fazer aqui pode ser criar uma classe base abstrata com todos os membros comuns do GIS e então herdar as outras classes X que não terão nada mais do que os mapeamentos NHibernate necessários.Eu usaria então o padrão Factory para criar o objeto do tipo específico usando seus metadados.

uma maneira de fazer isso é declarar uma interface, digamos IGisObject, que possui as propriedades comuns declaradas na interface.Em seguida, implemente uma classe concreta que mapeie cada tabela.Dessa forma, eles ainda serão todos do tipo IGisObject.

Você pode dar uma olhada no que Ayende está dizendo aqui: Entidades MultiTable.

Mas como você tem tabelas separadas, não acho que funcionará.Você também pode conferir grupo nhuser

Acho que perguntaria por que você está buscando os dados GIS diretamente no banco de dados e não usando a API que normalmente é fornecida como uma abstração para você.Se este for um sistema ESRI, existem ferramentas que permitem criar visualizações estáticas de banco de dados em seus objetos GIS e, a partir desse ponto, talvez seja apropriado para a extração de dados.

Na documentação do NHibernate, você poderia usar um dos mapeamentos de herança.

Você também pode ter uma classe separada para cada tabela, mas faça com que todas implementem alguma interface comum

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top