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();

