Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Problema referente a execução no session = NhibernateHelper.AbreSession()

Aula 3 do curso NHibernate: Persistencia de dados com C# Alguém poderia me ajudar, fiz igual o instrutor, mas na execução dá esse exception. Erro na execução do ISession session = NHibernateHelper.AbreSession();

Exception:

An unhandled exception of type 'System.TypeInitializationException' occurred in Loja.exe

Additional information: O inicializador de tipo de 'Loja.Infra.NHibernateHelper' acionou uma exceção.

9 respostas

Olá Diego,

somente pela exception não consegui ver o que aconteceu. Poderia colocar o código das classes NHibernateHelper, Loja, as classes de modelo (como Produto e Categoria), os arquivos .hbm e o .cfg para eu dar uma olhada, por favor? Ai consigo ver o que pode ter causado o erro.

Sim claro, lembrando que o meu problema é o mesmo do Nilson Martins...O título do fórum que ele abriu é: Problemas na Aula 3 - TypeInitializationException no NHibernate

------------Meu HibernateHelper.cs:

namespace Loja.Infra
{
    public class NHibernateHelper
    {
        private static ISessionFactory fabrica = CriaSessionFactory();

        public static Configuration RecuperaConfiguracao() 
        {
            Configuration cfg = new Configuration();
            cfg.Configure();
            cfg.AddAssembly(Assembly.GetExecutingAssembly());
            return cfg;
        }
        public static void GeraSchema() {
            Configuration cfg = RecuperaConfiguracao();
            new SchemaExport(cfg).Create(true, true);
        }
        public static ISession AbreSession() {
            return fabrica.OpenSession();
        }
        private static ISessionFactory CriaSessionFactory()
        {
            Configuration cfg = RecuperaConfiguracao();
            return cfg.BuildSessionFactory();
        }
    }
}

------------Meu Progam.cs:

namespace Loja
{
    class Program
    {
        static void Main(string[] args)
        {
            Categoria umaCategoria = new Categoria();
            umaCategoria.Nome = "Tudo";

            Produto produto = new Produto();
            produto.Nome = "Camiseta";
            produto.Preco = 10.0;
            produto.Categoria = umaCategoria;

            ISession session = NHibernateHelper.AbreSession();
            ITransaction transacao = session.BeginTransaction();

            session.Save(umaCategoria);
            session.Save(produto);

            transacao.Commit();
            session.Close();

            Console.Read();

        }
    }
}

------------Meu Categoria.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Loja.Entidades
{
    public class Categoria
    {
        public virtual int Id { get; set; }
        public virtual string Nome { get; set; }
    }
}

------------Meu Produto.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Loja.Entidades
{
    public class Produto
    {
        public virtual int Id { get; set; }
        public virtual string Nome { get; set; }
        public virtual double Preco { get; set; }
        public virtual Categoria Categoria { get; set; }
    }
}

------------Meu categoria.hbm.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="LojaWeb" namespace="LojaWeb.Entidades">
  <class name="Categoria">
    <id name="Id">
      <generator class="identity"/>
    </id>
    <property name="Nome"/>
  </class>
</hibernate-mapping>

------------Meu Produto.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="LojaWeb" namespace="LojaWeb.Entidades">
  <class name="Produto">
    <id name="Id">
      <generator class="identity"/>
    </id>
    <property name="Nome"/>
    <property name="Preco"/>
    <many-to-one name="Categoria" column="CategoriaId"/>
  </class>
</hibernate-mapping>

Fico no aguardo, muito obrigado pela ajuda...

solução!

Olá Diego,

qual o nome que você deu para o seu projeto? Foi LojaWeb ou Loja? Nos arquivos .hbm o assembly indica que o nome do projeto é LojaWeb. Mas como o namespace de todas as suas classes está como Loja, pode ser que o projeto se chame Loja e falta alterar o assembly para este nome.

Outra coisa que está causando problema é que nos .hbm do Produto e Categoria, os namespaces estão como LojaWeb.Entidades. No entanto, as classes estão nos namespaces de Loja.Entidades, ou seja, ele não está achando com que classes fazer o mapeamento.

Exatamente esse o problema, muito obrigado pela ajuda! Eu tinha criado os mapeamentos no projeto baixado de um arquivo lojaweb pois na parte escrita da terceira aula, orienta a baixar e fazer algumas alterações, fiz nele e depois colei nesse outro projeto que eu já estava alterando desde a primeira aula, aí juntou com o cansaço e deu nisso! Muito obrigado pela ajuda novamente.