Arquivos da Categoria: NHibernate

SAAS com NHibernate e Múltiplos Bancos de Dados

Olá pessoal.
Últimamente pesquisei sobre alguma forma de desenvolver uma aplicação SAAS (Software as a Service) com o NHibernate.

Imagine o seguinte cenário, eu preciso que em tempo de execução o NHibernate troque o banco de dados dependendo do domínio que acessa a aplicação.

Por exemplo, se eu entrar na aplicação pelo endereço cliente1.com.br será carregado o banco de dados cliente1 que terá todas as informações deste cliente e as informações de cores e tamanhos da interface gráfica. O mesmo acontece para o endereço cliente2.com.br e cliente3.com.br.

Uma das formas que encontrei de conseguir isto é aproveitando a total extensibilidade do NHibernate e plugar nele um ConnectionProvider customizado. o ConnectionProvider é o objeto que fornece as coneções para o NHibernate.

Eis o provider customizado:

    public class MultiDbConnectionProvider : DriverConnectionProvider
    {
        public override IDbConnection GetConnection()
        {
            IDbConnection connection = Driver.CreateConnection();

            try
            {
                connection.ConnectionString = SaasUtil.GetConnectionStringFromInstance();
                connection.Open();
            }
            catch (DbException)
            {
                connection.Dispose();
                throw;
            }
            return connection;
        }
    }

Não é muito complicado, eu apenas sobrescrevo o método GetConnection que cria uma nova conexão passando a connection string específica para aquele determinado cliente.

É preciso também mudar o arquivo de configuração para o novo provider:

<property name="connection.provider">
  My.Namespace.DbSpecificConnectionProvider, MyAssembly
</property>

Eu fiz um pequeno teste e funciona perfeitamente, porém não tenho muita certeza de como o NHibernate vai se comportar a nível de cache.

Como Excluir Várias Entidades no NHibernate

Quem já usou o Nhibernate, provavelmente já sentiu falta de algum recurso onde podemos remover de uma vez vários itens, pois com o método Delete do objeto de sessão só é possível deletar um objeto por vez.

Há uma forma de implementar uma exclusão múltipla no NHibernate usando a cláusula IN no HQL:

var idObjetos = new List<int>() { 5,3,6,7 };

_session.CreateQuery("DELETE FROM Produto p WHERE p.Id = IN :idObjetos")
.setParameterList("idObjetos", idObjetos)
.executeUpdate();
Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

%d bloggers like this: