NHibernate – One Session Per Request

Ao trabalhar com NHibernate, um dos principais desafios é gerenciar a Session. Podemos abrir a Session a cada consulta, mas isso seria bem custoso, pois em muitos casos precisamos recorrer ao banco de dados diversas vezes, além de perder uma das grandes vantagens do NHibernate que é utilizar o Lazy Load.
Uma maneira comum de se trabalhar com a session seria da maneira que eu mostro neste post, que ficaria mais ou menos assim:

        using (ISession session = NHibernateHelper.OpenSession()) { }

Porém, se trabalhamos desta maneira, e buscamos uma lista de usuários por exemplo. O código ficaria assim:

    public IList<User> GetAll()
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            var users = session.CreateCriteria<User>().List<User>();
            return users;
        }
    }

Continuar lendo

Anúncios

TUTORIAL: ASP.NET MVC COM NHIBERNATE E MYSQL – PARTE 2 – Criando o Repository

Na primeira parte do tutorial, nós mapeamos o nosso modelo utilizando o Mapping By Code do NHibernate. Como nosso modelo é basicamente um usuário com endereço, caso você queira popular o seu banco com os países, cidades e estados disponíveis, eu criei este gist no github.
Bem, vamos começar agora com o acesso aos dados. Vamos criar um Repository para o nosso usuário contendo as operações básicas: Salvar, Atualizar, Obter 1 usuário e Obter uma lista de usuários:

Continuar lendo

NHibernate – Exemplo utilizando CreateSQLQuery

Imagine que você possui uma classe chamada User e deseja realizar uma consulta utilizando sql com o nhibernate. Podemos para isso, utilizar o método CreateSQLQuery, onde passamos uma consulta sql normal, como “SELECT * FROM users” e obtemos o resultado. Vamos aos exemplos:

    public class User
    {
        public virtual Guid Id { get; set; }
        public virtual string FirstName { get; set; }
        public virtual string LastName { get; set; }
        public virtual string Nick { get; set; }
        public virtual string Email { get; set; }
    }

Podemos realizar a consulta da seguinte maneira:

using (ISession session = NHibernateHelper.OpenSession())
{
    var query = "SELECT {u.*} FROM seu_schema.users as u;";
    var results = session.CreateSQLQuery(query).List();
}

O problema desta consulta, é que List() nos retornará um object[] no lugar de uma lista de User. Mas nós podemos mostrar para o NHibernate que a consulta que nós estamos realizando deve retornar uma lista de User, e não um array de object. Para isso, fazemos o seguinte:

using (ISession session = NHibernateHelper.OpenSession())
{
    var query = "SELECT {u.*} FROM seu_schema.users as u;";
    var results = session.CreateSQLQuery(query).List()
                    .AddEntity("u", typeof(User))
                    .List<User>();
}

Basta informar que o nosso alias ‘u’ é referente a nossa classe User e pronto, o nhibernate agora poderá nos retornar uma lista de User!

Por hoje é só, abraço 😉

NHibernate Mapping by Code – Definindo um campo como Unique

Eu comecei um projeto recentemente utilizando o NHibernate e tenho gostado bastante dele. Resolvi criar este post mais como lembrete para mim mesmo, pois tive um pequeno probleminha ao refatorar o modelo e passar a definir um campo como Unique. O problema era que mesmo definindo o campo como Unique, ele não atualizava o schema. O problema é que quando você faz essas alterações, o schemaUpdate não resolve, e você precisa matar a sua base e criá-la de novo (não sei se há outra alternativa, porém foi a que eu achei).

Mapeando um model com um campo unique:

Continuar lendo