Como posso aproveitar ORM para um banco de dados cujo esquema é desconhecida até tempo de execução?

StackOverflow https://stackoverflow.com/questions/136366

Pergunta

Eu estou tentando ORM alavancagem dada aos seguintes requisitos:

1) Usar .NET Framework (mais recente Framework é bom)
2) Deve ser capaz de usar Sybase, Oracle, MSSQL alternadamente
3) O esquema é mais estático, mas há partes dinâmicas.

Estou um pouco familiarizado com SubSonic e NHibernate, mas não profundamente.
Tenho a sensação incômoda de que o ORM pode fazer o que eu quero, mas eu não sei como aproveitar isso no momento.

SubSonic provavelmente não é o ideal, uma vez que atualmente não suporta Sybase, e escrever o meu próprio provedor para isso está além dos meus recursos e capacidade no momento.

Para # 3 (acima), há um par de tabelas de metadados, que descrevem tabelas que os vendedores podem "grampo em" para o banco de dados existente.
Vamos chamar estes metatabelas e MetaFields .

Há um esquema base estática, que o ORM (NHibernate ATM) alças bem.
No entanto , um fornecedor pode adicionar uma tabela para o banco de dados (fisicamente), enquanto eles também adicionar os dados para as tabelas de metadados para descrever sua estrutura.

O que eu realmente gostaria é para mim ser capaz de alguma forma "feed" do ORM com que os metadados (de uma forma que ele entende) e tê-lo naquele ponto, permitam-me para manipular os dados.

O meu principal objetivo é reduzir a quantidade de instrução SQL genérico construção que tenho a fazer sobre essas tabelas dinâmicas.
Eu também gostaria de evitar ter que se preocupar com as diferenças de SQL sendo enviadas para Sybase, Oracle ou MSSQL.

O meu principal problema é que eu não tenho uma maneira de deixar ORM saber sobre as tabelas dinâmicas até a execução, quando eu vou ter acesso aos metadados

Editar : Um exemplo de uso pode ser como o delineado aqui :

IDataReader rdr = new consulta ( "DynamicTable1") WHERE ( "ArbitraryId", 2) .ExecuteReader ();.

(No entanto, ele não se parece com SubSonic vai funcionar, porque não há nenhum provedor Sybase (veja acima)

Foi útil?

Solução

monitores segundo este blog você pode em uso fato de NHibernate com mapeamento dinâmico . É preciso um pouco de ajustes embora ...

Outras dicas

Nós fizemos algumas das usando NHibernate, no entanto, parou o projeto, uma vez que não fornecer-nos com o ROI que queríamos. Nós acabamos de escrever a nossa própria camada ORM / SQL que funcionou muito bem (trabalhou desde que eu não trabalho lá, eu estou supondo que ele ainda funciona).

O nosso sistema usado um projeto de código aberto para gerar o SQL (não me lembro o nome mais) e construímos todas as nossas consultas em nossa própria língua baseada em XML (Consulta Markup Language - QML). Poderíamos, então, construir um xmlDocument com seleciona, wheres, grupos etc. e, em seguida, enviar para o SQLEngine que transformá-lo em uma instrução SQL e executá-lo. Nós Discusse, mas nunca implementado, um cache em tudo isso. Isso teria nos permitiu armazenar em cache os Qmls para consultas frequentemente utilizados.

Estou um pouco confuso a respeito de como o ORM seria usado, em seguida, em tempo de execução? Se o ORM seria dinamicamente construir algo em tempo de execução, como é que o código de tempo de execução saber o que o ORM fez dinamicamente?

"tê-lo naquele ponto permita-me para manipular os dados" - O que está manipulando os dados?

eu possa estar faltando alguma coisa aqui e eu aplogize se isso é o caso. (Eu só tenho realmente usado abordagem se fundo com ORM)

IDataReader não mapeia qualquer coisa para um objeto que você sabe. Portanto, o seu exemplo deve ser escrito usando construtor de consulta clássico.

Você já olhou para usando o ADO.NET Entity Framework?

MSDN: LINQ to Entities

Ele permite mapear tabelas de banco de dados para um modelo de objeto de tal maneira que você pode codificar sem pensar sobre qual fornecedor de banco de dados está sendo usado, e sem se preocupar com pequenas variações feitas por um DBA para as mesas reais. O mapeamento é mantido em arquivos de configuração que podem ser modificados quando as tabelas db são modificados sem a necessidade de uma recompilação.

Além disso, usando LINQ to Entities, você pode construir consultas de forma OO, então você não está escrevendo seqüências de consulta SQL reais.

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