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

Persistencia com NHiberate

Estou com duvidas depois que passamos para parte Web. A verdade é que estava desenvolvendo um projeto paralelo. Então refiz todas as classes e configurações para web. Criei as Entidades, Mapeamentos, configurei a classe NHibernate.cfg, a pasta infra, instalei o NHIBERATE O MYSQLDATA E O Niject fiz a configuração como explicado. O fato é que rodávamos o programa na classe "program" depois que passou para web fiquei um pouco perdido.Não estou sabendo como receber os dados de um formulário e gravar no banco. Abaixo minas classes (cotroller, entidade, model, dao, mapeamento, view)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ControleOCW.DAO;
using ControleOCW.Entidades;
using ControleOCW.Infra;
using ControleOCW.App_Start;
using NHibernate;
using Ninject;

namespace ControleOCW.Controllers
{
    public class ClienteController : Controller
    {

        public ActionResult Index()
        {

            return View();
        }

        public ActionResult Form()
        {


            return View();
        }

        public ActionResult Adiciona(Cliente cliente)
        {


            return RedirectToAction("Index");
        }



    }
}

using ControleOCW.Entidades;
using NHibernate;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Threading.Tasks;
using ControleOCW.Infra;



namespace ControleOCW.DAO
{
    public class ClienteDAO
    {
        private ISession session;


        public ClienteDAO(ISession session)
        {
            this.session = session;
        }


        public void Adiciona(Cliente cliente)
        {
            ITransaction transacao = session.BeginTransaction();
            session.Save(cliente);
            transacao.Commit();
        }


        // public Cliente BuscaPorId(int id)
        //  {
        //  return session.Get<Cliente>(id);
        //  }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ControleOCW.Entidades
{
    public class Cliente
    {
        public virtual int Id { get; set; }
        public virtual string Nome { get; set; }
        public virtual string Cnpj { get; set; }
        public virtual string Endereco { get; set; }
        public virtual string Bairro { get; set; }
        public virtual string Cidade { get; set; }
        public virtual string Cep { get; set; }
        public virtual string Telefone { get; set; }
        public virtual string Email { get; set; }
        public virtual string Contato { get; set; }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ControleOCW.Infra
{
    public class NHibernateHelper
    {
        // private static ISessionFactory fabrica = CriaSessionFactory();
        private static ISessionFactory fabrica = RecuperaConfiguracao().BuildSessionFactory();

        // private static ISessionFactory CriaSessioFactory() 
        // {
        //     Configuration cfg = RecuperaConfiguracao();
        //    return cfg.BuildSessionFactory();
        //}


        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();
        }
    }
}
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="ControleOCW"
                   namespace="ControleOCW.Entidades">
  <class name ="Cliente">
    <id name ="Id">
      <generator class ="identity"/>
    </id>
    <property name="Nome"/>
    <property name="Cnpj"/>
    <property name="Endereco"/>
    <property name="Bairro"/>
    <property name="Cidade"/>
    <property name="Cep"/>
    <property name="Telefone"/>
    <property name="Email"/>
    <property name="Contato"/>
  </class>
</hibernate-mapping>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ControleOCW.Models
{
    public class Cliente
    {
        public virtual int Id { get; set; }
        public virtual string Nome { get; set; }
        public virtual string Cnpj { get; set; }
        public virtual string Endereco { get; set; }
        public virtual string Bairro { get; set; }
        public virtual string Cidade { get; set; }
        public virtual string Cep { get; set; }
        public virtual string Telefone { get; set; }
        public virtual string Email { get; set; }
        public virtual string Contato { get; set; }
    }
}

<table>
    <thead>
        <tr>
            <th>Id</th>
            <th>Nome do Cliente</th>
            <th>CNPJ</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var cliente in Model)
        {
            <tr>
                <td>@cliente.Id</td>
                <td>@cliente.Nome</td>
                <td>@cliente.Cnpj</td>
            </tr>
        }
    </tbody>
</table>

@{
    ViewBag.Title = "Form";
}

<h2>Cadastro de Clientes</h2>

<form action="@Url.Action("Adiciona", "Cliente")" method="post">

     <label>
        Nome:
        <input type="text" name="cliente.Nome" />
    </label>

    <label>
        CNPJ:
        <input type="text" name="cliente.Cnpj" />
    </label>

    <label>
        Endereço:
        <input type="text" name="cliente.Endereco" />
    </label>

     <label>
        Bairro:
        <input type="text" name="cliente.Bairro" />
    </label>

    <label>
        Cidade:
        <input type="text" name="cliente.Cidade" />
    </label>

    <label>
        CEP:
        <input type="text" name="cliente.Cep" />
    </label>

     <label>
        Telefone:
        <input type="text" name="cliente.Telefone" />
    </label>

     <label>
        Email:
        <input type="text" name="cliente.Email" />
    </label>

     <label>
        Contato:
        <input type="text" name="cliente.Contato" />
    </label>

    <input type="submit" value="Adicionar"/>
</form>
11 respostas

Oi Leonardo

Com o código que você já desenvolveu já é possível receber a informação do Cliente que foi preenchido no formulário dentro do código do ClienteController. Agora dentro desse controller, você precisa você precisa utilizar o NHibernate para gravar a entidade no banco de dados, assim como foi feito durante a aplicação console:

public class ClienteController : Controller
{
   // resto do controller
   public ActionResult Adiciona(Cliente cliente)
   {
      ISession session = NHibernateHelper.AbreSession();
      ClienteDAO dao = new ClienteDAO(session);
      dao.Adiciona(cliente);
      session.Close();
      return RedirectToAction("Index");
   }
}

Veja que esse é exatamente o código que colocaríamos dentro do método Main em uma aplicação do tipo console application.

Agora uma facilidade que é explorada no curso e que geralmente não é utilizada em um console application é a injeção de dependências para controlar e compartilhar a session do NHibernate.

Para isso, como explicado no exercício do curso de NHibernate precisamos utilizar uma biblioteca que ensina o Asp.Net MVC como é que ele deve construir os controllers que serão utilizados pela aplicação. E é por isso que nós instalamos o NInject.MVC. Esse plugin substitui o componente do asp.net mvc que constroi os controllers utilizados pela aplicação.

Depois que o plugin está instalado e configurado como mostrado no curso, podemos simplificar o código do cadastro para:

public class ClienteController : Controller
{
   private ClienteDAO dao;
   // recebe o ClienteDAO por um construtor gerenciado
   // pelo ninject
   public ClienteController(ClienteDAO dao)
   {
      this.dao = dao;
   }
   // resto do controller
   public ActionResult Adiciona(Cliente cliente)
   {
      // Agora não precisamos mais gerenciar manualmente
      // a abertura e o fechamento da session
      // e nem a criação do DAO

      dao.Adiciona(cliente);

      return RedirectToAction("Index");
   }
}

Boa Tarde, Victor! Então eu estava no caminho certo, vamos continuar sem fazer uso do Ninject, bom quando executo o programa e preencho o form, ele para de executar nessa linha ( ISession session = NHibernateHelper.AbreSession();) dentro do método adiciona no controller, a lista de erros abaixo eu vejo que ele pegou o que digitei e logo em seguida a session vem null.

cliente id=0
nome = teste
session=null

Grato;

Oi Leonardo

Esse comportamento que você está tendo no projeto está acontecendo provavelmente por que o método AbreSession do NHibernateHelper está jogando uma exceção.

Para sabermos o que está errado, poste aqui no forum a stack trace (o texto que é mostrada na tela de erro do asp.net mvc) que é mostrada no navegador. Com isso podemos diagnosticar o erro de configuração que você está tendo.

System.TypeInitializationException não foi manipulada pelo código do usuário
  HResult=-2146233036
  Message=O inicializador de tipo de 'SistemaOCW.Infra.NHibernateHelper' acionou uma exceção.
  Source=SistemaOCW
  TypeName=SistemaOCW.Infra.NHibernateHelper
  StackTrace:
       em SistemaOCW.Infra.NHibernateHelper.AbreSession()
       em SistemaOCW.Controllers.ClienteController.Adiciona(Cliente cliente) na d:\OCW\SistemaOCW\SistemaOCW\Controllers\ClienteController.cs:linha 31
       em lambda_method(Closure , ControllerBase , Object[] )
       em System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
       em System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
       em System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
       em System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
       em System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
  InnerException: NHibernate.Cfg.HibernateConfigException
       HResult=-2146232832
       Message=An exception occurred during configuration of persistence layer.
       Source=NHibernate
       StackTrace:
            em NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration..ctor(XmlReader hbConfigurationReader, Boolean fromAppSetting)
            em NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration..ctor(XmlReader hbConfigurationReader)
            em NHibernate.Cfg.Configuration.Configure(XmlReader textReader)
            em NHibernate.Cfg.Configuration.Configure(String fileName, Boolean ignoreSessionFactoryConfig)
            em NHibernate.Cfg.Configuration.Configure(String fileName)
            em NHibernate.Cfg.Configuration.Configure()
            em SistemaOCW.Infra.NHibernateHelper.RecuperaConfiguracao() na d:\OCW\SistemaOCW\SistemaOCW\Infra\NHibernateHelper.cs:linha 18
            em SistemaOCW.Infra.NHibernateHelper..cctor() na d:\OCW\SistemaOCW\SistemaOCW\Infra\NHibernateHelper.cs:linha 13
       InnerException: System.IO.FileNotFoundException
            HResult=-2147024894
            Message=Não foi possível localizar o arquivo 'd:\OCW\SistemaOCW\SistemaOCW\bin\hibernate.cfg.xml'.
            Source=mscorlib
            FileName=d:\OCW\SistemaOCW\SistemaOCW\bin\hibernate.cfg.xml
            StackTrace:
                 em System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
                 em System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
                 em System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize)
                 em System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy)
                 em System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn)
                 em System.Xml.XmlTextReaderImpl.OpenUrlDelegate(Object xmlResolver)
                 em System.Threading.CompressedStack.runTryCode(Object userData)
                 em System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
                 em System.Threading.CompressedStack.Run(CompressedStack compressedStack, ContextCallback callback, Object state)
                 em System.Xml.XmlTextReaderImpl.OpenUrl()
                 em System.Xml.XmlTextReaderImpl.Read()
                 em System.Xml.XmlTextReader.Read()
                 em System.Xml.XmlCharCheckingReader.Read()
                 em System.Xml.XsdValidatingReader.Read()
                 em System.Xml.XPath.XPathDocument.LoadFromReader(XmlReader reader, XmlSpace space)
                 em System.Xml.XPath.XPathDocument..ctor(XmlReader reader, XmlSpace space)
                 em System.Xml.XPath.XPathDocument..ctor(XmlReader reader)
                 em NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration..ctor(XmlReader hbConfigurationReader, Boolean fromAppSetting)
            InnerException:

Oi Leonardo

Pela exceção que você postou, parece que você se esqueceu de colocar o arquivo hibernate.cfg.xml na raiz do projeto ou não mudou a propriedade Copy to Output Directory do arquivo para Always Copy e por isso o NHibernate não está conseguindo achar o arquivo de configuração do projeto.

Certo Victor, tinha esquecido mesmo de fazer esse processo do (Always Copy), refiz rodei a aplicação e da o erro abaixo na ( session.Save(cliente);) do método adiciona na classe dao. Esta relacionado ao (embedded resource) da classe mapeamento ? se for quando mudo essa propriedade na classe de mapeamento volta a acusar o erro anterior. Grato;

NHibernate.MappingException não foi manipulada pelo código do usuário
  HResult=-2146232832
  Message=No persister for: SistemaOCW.Entidade.Cliente
  Source=NHibernate
  StackTrace:
       em NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName)
       em NHibernate.Impl.SessionImpl.GetEntityPersister(String entityName, Object obj)
       em NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
       em NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
       em NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
       em NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
       em NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
       em NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
       em NHibernate.Impl.SessionImpl.Save(Object obj)
       em SistemaOCW.DAO.ClienteDAO.Adiciona(Cliente cliente) na d:\OCW\SistemaOCW\SistemaOCW\DAO\ClienteDAO.cs:linha 26
       em SistemaOCW.Controllers.ClienteController.Adiciona(Cliente cliente) na d:\OCW\SistemaOCW\SistemaOCW\Controllers\ClienteController.cs:linha 34
       em lambda_method(Closure , ControllerBase , Object[] )
       em System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
       em System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
       em System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
       em System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
       em System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
  InnerException:

Oi Leonardo

Esse erro está acontecendo agora porque você provavelmente não colocou mudou o Build Action do Cliente.hbm.xml para Embedded Resource, com isso o NHibernate não está conseguindo encontrar o mapeamento e por isso ele acha que a sua classe Cliente não está mapeada para o banco de dados.

Certo Victor, como te disse depois que coloco a classe de mapeamento com recurso incorporado,volto a rodar a aplicação e ela volta para o erro anterior da session vir nula, vou la na classe hiberte.cfg.xml em propriedades e esta marcado copiar sempre.

System.TypeInitializationException não foi manipulada pelo código do usuário
  HResult=-2146233036
  Message=O inicializador de tipo de 'SistemaOCW.Infra.NHibernateHelper' acionou uma exceção.
  Source=SistemaOCW
  TypeName=SistemaOCW.Infra.NHibernateHelper
  StackTrace:
       em SistemaOCW.Infra.NHibernateHelper.AbreSession()
       em SistemaOCW.Controllers.ClienteController.Adiciona(Cliente cliente) na d:\OCW\SistemaOCW\SistemaOCW\Controllers\ClienteController.cs:linha 31
       em lambda_method(Closure , ControllerBase , Object[] )
       em System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
       em System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
       em System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
       em System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
       em System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
  InnerException: NHibernate.MappingException
       HResult=-2146232832
       Message=Could not compile the mapping document: SistemaOCW.Mapeamentos.Cliente.hbm.xml
       Source=NHibernate
       StackTrace:
            em NHibernate.Cfg.Configuration.LogAndThrow(Exception exception)
            em NHibernate.Cfg.Configuration.AddDeserializedMapping(HbmMapping mappingDocument, String documentFileName)
            em NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc)
            em NHibernate.Cfg.Configuration.ProcessMappingsQueue()
            em NHibernate.Cfg.Configuration.AddDocumentThroughQueue(NamedXmlDocument document)
            em NHibernate.Cfg.Configuration.AddXmlReader(XmlReader hbmReader, String name)
            em NHibernate.Cfg.Configuration.AddInputStream(Stream xmlInputStream, String name)
            em NHibernate.Cfg.Configuration.AddResource(String path, Assembly assembly)
            em NHibernate.Cfg.Configuration.AddAssembly(Assembly assembly)
            em SistemaOCW.Infra.NHibernateHelper.RecuperaConfiguracao() na d:\OCW\SistemaOCW\SistemaOCW\Infra\NHibernateHelper.cs:linha 19
            em SistemaOCW.Infra.NHibernateHelper..cctor() na d:\OCW\SistemaOCW\SistemaOCW\Infra\NHibernateHelper.cs:linha 13
       InnerException: NHibernate.MappingException
            HResult=-2146232832
            Message=persistent class SistemaOCW.Entidades.Cliente, SistemaOCW not found
            Source=NHibernate
            StackTrace:
                 em NHibernate.Cfg.XmlHbmBinding.Binder.ClassForFullNameChecked(String fullName, String errorMessage)
                 em NHibernate.Cfg.XmlHbmBinding.Binder.ClassForNameChecked(String name, Mappings mappings, String errorMessage)
                 em NHibernate.Cfg.XmlHbmBinding.ClassBinder.BindClass(IEntityMapping classMapping, PersistentClass model, IDictionary`2 inheritedMetas)
                 em NHibernate.Cfg.XmlHbmBinding.RootClassBinder.Bind(HbmClass classSchema, IDictionary`2 inheritedMetas)
                 em NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddRootClasses(HbmClass rootClass, IDictionary`2 inheritedMetas)
                 em NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddEntitiesMappings(HbmMapping mappingSchema, IDictionary`2 inheritedMetas)
                 em NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.Bind(HbmMapping mappingSchema)
                 em NHibernate.Cfg.Configuration.AddDeserializedMapping(HbmMapping mappingDocument, String documentFileName)
            InnerException: System.TypeLoadException
                 HResult=-2146233054
                 Message=Não foi possível carregar o tipo SistemaOCW.Entidades.Cliente do assembly SistemaOCW, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
                 Source=mscorlib
                 TypeName=SistemaOCW.Entidades.Cliente
                 StackTrace:
                      em System.Reflection.RuntimeAssembly.GetType(RuntimeAssembly assembly, String name, Boolean throwOnError, Boolean ignoreCase, ObjectHandleOnStack type)
                      em System.Reflection.RuntimeAssembly.GetType(String name, Boolean throwOnError, Boolean ignoreCase)
                      em System.Reflection.Assembly.GetType(String name, Boolean throwOnError)
                      em NHibernate.Util.ReflectHelper.TypeFromAssembly(AssemblyQualifiedTypeName name, Boolean throwOnError)
                      em NHibernate.Util.ReflectHelper.ClassForName(String name)
                      em NHibernate.Cfg.XmlHbmBinding.Binder.ClassForFullNameChecked(String fullName, String errorMessage)
                 InnerException:

Oi Leonardo

Você mudou o código do mapeamento que você postou aqui no alura? A exceção diz que o seu arquivo de mapeamento é de uma classe chamada SistemaOCW.Entidades.Cliente, mas o mapeamento e a classe que você postou no fórum são do namespace ControleOCW.Entidades, logo no arquivo de mapeamento você deveria declarar esse namespace.

Além disso, o nome do assembly também deve estar incorreto, pois no código postado você colocou ControleOCW e na exceção o NHibernate está procurando SistemaOCW.

Cara tive que refazer aquele projeto deu problema ai comecei tudo de novo da mesma forma so mudei o nome do projeto. projeto novo com as classes abaixo:

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// As Informações Gerais sobre um assembly são controladas por meio do 
// conjunto de atributos a seguir. Altere esses valores de atributo para modificar as informações
// associadas a um assembly.
[assembly: AssemblyTitle("SistemaOCW")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SistemaOCW")]
[assembly: AssemblyCopyright("Copyright ©  2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// A configuração de ComVisible como false torna os tipos deste assembly invisíveis 
// para componentes COM. Se for necessário acessar um tipo neste assembly a partir do 
// COM, defina o atributo ComVisible como true nesse tipo.
[assembly: ComVisible(false)]

// A GUID a seguir será referente à ID do typelib se este projeto for exposto ao COM
[assembly: Guid("7aa6634d-4b27-4d0a-b800-6fe4ad1f3412")]

// As informações de versão de um assembly consistem nos seguintes quatro valores:
//
//      Versão Principal
//      Versão Secundária 
//      Número da Versão
//      Revisão
//
// Você pode especificar todos os valores ou pode usar como padrão os Números da Versão e de Revisão 
// usando o '*' como mostrado abaixo:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
using NHibernate;
using SistemaOCW.DAO;
using SistemaOCW.Entidade;
using SistemaOCW.Infra;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;


namespace SistemaOCW.Controllers
{
    public class ClienteController : Controller
    {  

           public ActionResult Form()
        {
            return View();
        }
        //
        // GET: /Cliente/

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Adiciona(Cliente cliente)
        {
            ISession session = NHibernateHelper.AbreSession();
            ClienteDAO dao = new ClienteDAO(session);       

            dao.Adiciona(cliente);
            session.Close();
            return RedirectToAction("Index");
        }

    }
}
using SistemaOCW.Entidade;
using System;
using System.Collections.Generic;
using System.EnterpriseServices;
using System.Linq;
using System.Web;
using SistemaOCW.Infra;
using NHibernate;

namespace SistemaOCW.DAO
{
    public class ClienteDAO
    {
        private ISession session;


        public ClienteDAO(ISession session)
        {
            this.session = session;
        }


        public void Adiciona(Cliente cliente)
        {
            NHibernate.ITransaction transacao = session.BeginTransaction();
            session.Save(cliente);
            transacao.Commit();
        }


        // public Cliente BuscaPorId(int id)
        //  {
        //  return session.Get<Cliente>(id);
        //  }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace SistemaOCW.Entidade
{
    public class Cliente
    {
        public virtual int Id { get; set; }
        public virtual string Nome { get; set; }

    }
}
using NHibernate;
using NHibernate.Cfg;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;

namespace SistemaOCW.Infra
{
    public class NHibernateHelper
    {
        private static ISessionFactory fabrica = RecuperaConfiguracao().BuildSessionFactory();

        public static Configuration RecuperaConfiguracao()
        {
            Configuration cfg = new Configuration();
            cfg.Configure();
            cfg.AddAssembly(Assembly.GetExecutingAssembly());
            return cfg;
        }
<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="SistemaOCW"
                   namespace="SistemaOCW.Entidades">
  <class name ="Cliente">
    <id name ="Id">
      <generator class ="identity"/>
    </id>
    <property name="Nome"/>  
  </class>
</hibernate-mapping>
@{
    ViewBag.Title = "Form";
}

<h2>Cadastro Cliente</h2>

<form action="@Url.Action("Adiciona", "Cliente")" method="post">
    <label>
        Nome:
        <input type="text" name="cliente.Nome" />
    </label>
    <input type="submit" value="Adicionar"/>
</form>
<?xml version="1.0" encoding="utf-8" ?>

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">
      NHibernate.Connection.DriverConnectionProvider
    </property>
    <property name="dialect">
      NHibernate.Dialect.MySQLDialect
    </property>
    <property name="connection.driver_class">
      NHibernate.Driver.MySqlDataDriver
    </property>
    <property name="connection.connection_string">
      Server=localhost;Database=compras; Uid=root; Pwd=root;
    </property>
    <property name="hbm2ddl.auto">update</property>
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
  </session-factory>

</hibernate-configuration>
solução!

Oi Leonardo

O problema agora é que o código no código da sua classe Cliente, o namespace declarado é SistemaOCW.Entidade mas no arquivo de mapeamento (o Cliente.hbm.xml) o namespace que você declarou no xml ficou SistemaOCW.Entidades (sobrou um s no final do namespace).

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software