You are on page 1of 85

C# WebDeveloper

Domingo, 30 de Agosto de 2015


Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Criando o Projeto MVC

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Data Access Layer (DAL)


Camada de acesso a dados

Estrutura do projeto:

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Criando a base de dados:

Criando a tabela de produtos...

go

create table Produto(


IdProduto integer
Nome
nvarchar(50)
Preco
decimal(18,3)
Foto
nvarchar(50)
primary key(IdProduto))

identity(1,1),
not null,
not null,
not null unique,

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

\Web.config.xml
ConnectionString
<connectionStrings>
<add
name="aula"
connectionString="Data Source=(LocalDB)\v11.0;
AttachDbFilename=C:\Users\Coti\Desktop\Aula_16.08.15\Aula19\
Projeto.Web\App_Data\Banco.mdf;Integrated Security=True"
/>
</connectionStrings>

Criando a classe de entidade:


/Entity/Produto.cs
using
using
using
using
using

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

namespace Projeto.DAL.Entity
{
public class Produto
{
public int IdProduto
public string Nome {
public decimal Preco
public string Foto {
}
}

{ get; set; }
get; set; }
{ get; set; }
get; set; }

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

NHibernate
Verso do framework Hibernate (Java) para .Net. Consiste de uma
ferramenta para acesso a bases de dados de diversas plataformas
(Oracle, SqlServer, MySql, PostGre, FireBird, DB2, etc...)
um framework ORM (Mapeamento Objeto Relacional) e pode ser
integrado facilmente ao ambiente .NET
Instalando o NHibernate
Manage NuGet Packages

C# WebDeveloper

Aula

Domingo, 30 de Agosto de 2015


Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

21

ORM (Mapeamento Objeto Relacional)


Para mapearmos a entidade Produto, o primeiro passo no Hibernate
declarar todos os atributos da classe como
using
using
using
using
using

virtual

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

namespace Projeto.DAL.Entity
{
public class Produto
{
public virtual int IdProduto
public virtual string Nome {
public virtual decimal Preco
public virtual string Foto {
}
}

{ get; set; }
get; set; }
{ get; set; }
get; set; }

No NHibernate, a bilbioteca para mapeamento das entidades chamase Fluent. Para que possamos mapear as classes de entidade,
deveremos criar para cada uma delas classes de mapeamento
Namespace:

using
using
using
using

FluentNHibernate.Mapping

System;
System.Collections.Generic;
System.Linq;
System.Text;

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

using System.Threading.Tasks;
using FluentNHibernate.Mapping; //ORM (Mapeamento)
using Projeto.DAL.Entity; //classes de entidade
namespace Projeto.DAL.Mapping
{
//Regra 1) Herdar de ClassMap e definir o tipo da entidade..
public class ProdutoMap : ClassMap<Produto>
{
//Regra 2) Definir um construtor e detalhar o mapeamento..
public ProdutoMap()
{
//Nome da tabela..
Table("Produto");
//Chave primria..
Id(p => p.IdProduto, "IdProduto").GeneratedBy.Identity();
//demais
Map(p =>
Map(p =>
Map(p =>

atributos..
p.Nome, "Nome").Length(50).Not.Nullable();
p.Preco, "Preco").Not.Nullable();
p.Foto, "Foto").Length(50).Not.Nullable().Unique();

}
}
}

ISessionFactory
Consiste de uma interface do NHibernate utilizada para gerar
conexes com uma base de dados. Devemos criar uma classe que
configure eprepare essa fbrica de conexes.
Por boa prtica, em NHibernate, a classe que ser responsvel por
gerar e configurar a ISessionFactory ser chamada de

HibernateUtil

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

using
using
using
using
using
using
using
using
using
using
using
using

Aula

21

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
NHibernate;
NHibernate.Cfg;
FluentNHibernate;
FluentNHibernate.Cfg;
FluentNHibernate.Cfg.Db;
System.Configuration;
Projeto.DAL.Mapping;

namespace Projeto.DAL.Util
{
//Classe para configurar e retornar a fbrica de conexes..
public class HibernateUtil
{
//Mtodo padro para gerar a ISessionFactory
//static -> mtodo que j ir ter espao de memria definido..
public static ISessionFactory GetSessionFactory()
{
try
{
return Fluently.Configure().Database(
MsSqlConfiguration.MsSql2008.ConnectionString(
ConfigurationManager.
ConnectionStrings["aula"].ConnectionString)).
Mappings(m => m.FluentMappings.
AddFromAssemblyOf<ProdutoMap>()).
BuildSessionFactory();
}
catch(Exception e)
{
throw new Exception("Erro ao gerar session factory: "
+ e.Message);
}
}
}
}

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Generic DAL
Padro utilizado para definir uma camada de persistncia com
operaes genricas de CRUD para banco de dados.

using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
NHibernate; //acesso a banco..
NHibernate.Linq; //consultas..
Projeto.DAL.Util; //HibernateUtil..

namespace Projeto.DAL.Generics
{
public abstract class GenericDal<T>
where T : class
{
//mtodo para inserir um registro na base de dados..
public void Insert(T obj)
{
using(ISession s = HibernateUtil.GetSessionFactory().OpenSession())
{
ITransaction t = s.BeginTransaction(); //iniciando transao..
s.Save(obj); //inserindo o registro..
t.Commit(); //executar a transao..
}
}
//mtodo para excluir um registro na base de dados..
public void Delete(T obj)
{
using (ISession s = HibernateUtil.GetSessionFactory().OpenSession())
{
ITransaction t = s.BeginTransaction(); //iniciando transao..

10

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

s.Delete(obj); //deletando o registro..


t.Commit(); //executar a transao..
}
}
//mtodo para atualizar um registro na base de dados..
public void Update(T obj)
{
using (ISession s = HibernateUtil.GetSessionFactory().OpenSession())
{
ITransaction t = s.BeginTransaction(); //iniciando transao..
s.Update(obj); //atualizando o registro..
t.Commit(); //executar a transao..
}
}
//mtodo para retornar 1 registro pelo id..
public T FindById(int id)
{
using(ISession s = HibernateUtil.GetSessionFactory().OpenSession())
{
return (T) s.Get(typeof(T), id);
}
}
//mtodo para listar todos os produtos..
public List<T> FindAll()
{
using(ISession s = HibernateUtil.GetSessionFactory().OpenSession())
{
//LINQ (Language Integrated Query)
var query = from obj in s.Query<T>()
select obj;
//retornar os dados da consulta..
return query.ToList();
}
}
}
}

Classe de persistncia:
/Persistence/ProdutoDal.cs
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
Projeto.DAL.Entity; //entidades
Projeto.DAL.Generics; //GenericDal

namespace Projeto.DAL.Persistence
{
public class ProdutoDal : GenericDal<Produto>
{
}
}

11

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Adicionando referencia no
Projeto Web para a camada DAL:

12

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Instalando o bootstrap:

13

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

MasterPage

Definindo a pgina de layout padro...

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Layout</title>
<link href="~/Content/bootstrap.css" rel="stylesheet" />
<link href="~/Content/bootstrap-theme.css" rel="stylesheet" />

14

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

</head>
<body>
<div class="container">
<h3>Projeto Loja Virtual</h3>
<br /><br />
<a href="/Produto/Loja" class="btn btn-primary">
Loja de Produtos
</a>
<a href="/Produto/Cesta" class="btn btn-danger">
Minha Cesta de Compras
</a>
<hr />
@RenderBody()
</div>
</body>
</html>

Criando o Controle:
/ProdutoController

15

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

using
using
using
using
using

Aula

21

System;
System.Collections.Generic;
System.Linq;
System.Web;
System.Web.Mvc;

namespace Projeto.Web.Controllers
{
public class ProdutoController : Controller
{
// GET: /Produto/Loja
public ActionResult Loja()
{
return View();
}
// GET: /Produto/Cesta
public ActionResult Cesta()
{
return View();
}
}
}

16

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

@{
ViewBag.Title = "Loja";
Layout = "~/Views/Shared/Layout.cshtml";
}
<h4>Bem vindo Loja de Produtos</h4>
<br /><br />

17

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

@{
ViewBag.Title = "Cesta";
Layout = "~/Views/Shared/Layout.cshtml";
}
<h4>Minha Cesta de Compras</h4>
<br /><br />

App_Start/RouteConfig.cs
Definindo a pgina inicial
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Web;
System.Web.Mvc;
System.Web.Routing;

namespace Projeto.Web
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{

18

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Produto", action = "Loja",
id = UrlParameter.Optional }
);
}
}
}

Executando:

Consulta para exibir os produtos na pgina da Loja


ProdutoController
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Web;
System.Web.Mvc;
Projeto.DAL.Entity; //entidades
Projeto.DAL.Persistence; //acesso a banco

namespace Projeto.Web.Controllers
{
public class ProdutoController : Controller
{
// GET: /Produto/Loja
public ActionResult Loja()
{
try
{
ProdutoDal d = new ProdutoDal(); //persistencia..
//executando a consulta e armazenando em um ViewBag..
ViewBag.Dados = d.FindAll();
}
catch(Exception e)
{
ViewData["Mensagem"] = e.Message;
}

19

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

return View();
}
// GET: /Produto/Cesta
public ActionResult Cesta()
{
return View();
}
}
}

Na pgina:
@{
ViewBag.Title = "Loja";
Layout = "~/Views/Shared/Layout.cshtml";
}
<h4>Bem vindo Loja de Produtos</h4>
<br /><br />
<p>
@ViewData["Mensagem"]
</p>
<div class="row">
@foreach(var p in ViewBag.Dados)
{
<div class="col-md-4">
<div class="panel panel-primary">
<div class="panel-heading">
Produto em Oferta
</div>
<div class="panel-body text-center">
<img src="/Imagens/@p.Foto" width="100" height="100" />
<h4>@p.Nome</h4>
Apenas <strong>@string.Format("{0:c}", p.Preco)</strong>
</div>
<div class="panel-footer">
@Html.ActionLink("Comprar", "AdicionarItem",
new { id = p.IdProduto },
new { @class = "btn btn-success btn-block" } )
</div>
</div>
</div>
}
</div>

20

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Modelagem da Cesta de Compras:

Criando as classes de modelo:

21

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

using
using
using
using
using

Aula

21

System;
System.Collections.Generic;
System.Linq;
System.Web;
Projeto.DAL.Entity; //entidades..

namespace Projeto.Web.Models
{
public class ItemCesta
{
public int Quantidade { get; set; }
public decimal ValorTotal
{
get
{
return (Produto.Preco * Quantidade);
}
}
//Associao (TER-1)
public Produto Produto { get; set; }
}
}

using
using
using
using

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

namespace Projeto.Web.Models
{
public class Cesta
{
public decimal ValorTotal
{
get
{

22

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

return Itens.Sum(i => i.ValorTotal);


}
}
//Associao (TER-Muitos)
public List<ItemCesta> Itens { get; set; }
}
}

Pgina da cesta de compras:


@{
ViewBag.Title = "Cesta";
Layout = "~/Views/Shared/Layout.cshtml";
}
<h4>Minha Cesta de Compras</h4>
<br /><br />
<table class="table table-hover">
<thead>
<tr>
<th>Foto</th>
<th>Nome do Produto</th>
<th>Preo</th>
<th>Quantidade</th>
<th>Total</th>
<th>Operaes</th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<td colspan="6">
Total da Cesta: <strong></strong>
</td>
</tr>
</tfoot>
</table>

23

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Incluindo um Produto como


Item na Cesta de Compras:
using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Web;
System.Web.Mvc;
Projeto.DAL.Entity; //entidades
Projeto.DAL.Persistence; //acesso a banco
Projeto.Web.Models; //classes de modelo..

namespace Projeto.Web.Controllers
{
public class ProdutoController : Controller
{
// GET: /Produto/Loja
public ActionResult Loja()
{
try
{
ProdutoDal d = new ProdutoDal(); //persistencia..
//executando a consulta e armazenando em um ViewBag..
ViewBag.Dados = d.FindAll();
}
catch(Exception e)
{
ViewData["Mensagem"] = e.Message;
}
return View();
}
// GET: /Produto/Cesta
public ActionResult Cesta()
{
return View();
}

[HttpGet] //recebe dados por URL


public ActionResult AdicionarItem(int id)
{
try
{
//Resgatar o produto no banco pelo id...
ProdutoDal d = new ProdutoDal(); //persistencia..
Produto p = d.FindById(id); //buscando 1 produto pelo id..
//criar um item da cesta de compras..
ItemCesta item = new ItemCesta();
item.Quantidade = 1;
item.Produto = p; //relacionando..
//criar a cesta de compras..
Cesta c = new Cesta();
c.Itens = new List<ItemCesta>();
c.Itens.Add(item); //adicionar produto..
//armazenar a cesta em sesso..

24

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Session.Add("cesta", c);
}
catch(Exception e)
{
ViewData["Mensagem"] = e.Message;
}
return View("Cesta"); //nome da pgina
}
}
}

Exibindo os itens da Cesta na pgina:


@{
ViewBag.Title = "Cesta";
Layout = "~/Views/Shared/Layout.cshtml";
}
<h4>Minha Cesta de Compras</h4>
<br /><br />
@using Projeto.Web.Models
@if(Session["cesta"] != null)
{
<table class="table table-hover">
<thead>
<tr>
<th>Foto</th>
<th>Nome do Produto</th>
<th>Preo</th>
<th>Quantidade</th>
<th>Total</th>
<th>Operaes</th>
</tr>
</thead>
<tbody>
@{
Cesta c = (Cesta) Session["cesta"];
foreach(ItemCesta item in c.Itens)
{
<tr>
<td> <img src="/Imagens/@item.Produto.Foto"
width="50" height="50" /> </td>
<td> @item.Produto.Nome </td>
<td> @string.Format("{0:c}", item.Produto.Preco) </td>
<td> @item.Quantidade </td>
<td> @string.Format("{0:c}", item.ValorTotal) </td>
<td>
</td>
</tr>
}
}
</tbody>

25

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

<tfoot>
<tr>
<td colspan="6">
Total da Cesta:
<strong> @string.Format("{0:c}", c.ValorTotal) </strong>
</td>
</tr>
</tfoot>
</table>
}
else
{
<label>No existem produtos em sua cesta de compras.</label>
}

Executando:

Acumulando produtos na cesta de compras:


using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Web;
System.Web.Mvc;
Projeto.DAL.Entity; //entidades
Projeto.DAL.Persistence; //acesso a banco
Projeto.Web.Models; //classes de modelo..

namespace Projeto.Web.Controllers
{
public class ProdutoController : Controller
{
// GET: /Produto/Loja
public ActionResult Loja()
{

26

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

try
{
ProdutoDal d = new ProdutoDal(); //persistencia..
//executando a consulta e armazenando em um ViewBag..
ViewBag.Dados = d.FindAll();
}
catch(Exception e)
{
ViewData["Mensagem"] = e.Message;
}
return View();
}
// GET: /Produto/Cesta
public ActionResult Cesta()
{
return View();
}

[HttpGet] //recebe dados por URL


public ActionResult AdicionarItem(int id)
{
try
{
//Resgatar o produto no banco pelo id...
ProdutoDal d = new ProdutoDal(); //persistencia..
Produto p = d.FindById(id); //buscando 1 produto pelo id..
//criar um item da cesta de compras..
ItemCesta item = new ItemCesta();
item.Quantidade = 1;
item.Produto = p; //relacionando..
//criar a cesta de compras..
Cesta c = new Cesta();
if(Session["cesta"] != null) //se existe uma cesta em sesso..
{
//resgatando a cesta da sesso..
c = (Cesta) Session["cesta"];
}
else
{
c.Itens = new List<ItemCesta>();
}
//verificar se o produto ja existe como item da cesta..
//buscar o item dentro da cesta de compras..
ItemCesta itemExistente = c.Itens
.Where(i => i.Produto.IdProduto == id)
.FirstOrDefault();
if(itemExistente != null)
{
itemExistente.Quantidade++; //incremento..
}
else
{
c.Itens.Add(item); //adicionar produto..

27

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

}
//armazenar a cesta em sesso..
Session.Add("cesta", c);
}
catch(Exception e)
{
ViewData["Mensagem"] = e.Message;
}
return View("Cesta"); //nome da pgina
}
}
}

Executando:

@{
ViewBag.Title = "Cesta";
Layout = "~/Views/Shared/Layout.cshtml";
}
<h4>Minha Cesta de Compras</h4>
<br /><br />
@using Projeto.Web.Models
@if(Session["cesta"] != null)
{
<table class="table table-hover">
<thead>
<tr>

28

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

<th>Foto</th>
<th>Nome do Produto</th>
<th>Preo</th>
<th>Quantidade</th>
<th>Total</th>
<th>Operaes</th>
</tr>
</thead>
<tbody>
@{
Cesta c = (Cesta) Session["cesta"];
foreach(ItemCesta item in c.Itens)
{
<tr>
<td> <img src="/Imagens/@item.Produto.Foto"
width="50" height="50" /> </td>
<td> @item.Produto.Nome </td>
<td> @string.Format("{0:c}", item.Produto.Preco) </td>
<td> @item.Quantidade </td>
<td> @string.Format("{0:c}", item.ValorTotal) </td>
<td>
@Html.ActionLink("+", "AumentarQuantidade",
new { id = item.Produto.IdProduto },
new { @class = "btn btn-primary btn-sm" })
@Html.ActionLink("-", "DiminuirQuantidade",
new { id = item.Produto.IdProduto },
new { @class = "btn btn-warning btn-sm" })
@Html.ActionLink("Remover", "RemoverItem",
new { id = item.Produto.IdProduto },
new { @class = "btn btn-danger btn-sm" })
</td>
</tr>
}
}
</tbody>
<tfoot>
<tr>
<td colspan="6">
Total da Cesta:
<strong> @string.Format("{0:c}", c.ValorTotal) </strong>
</td>
</tr>
</tfoot>
</table>
}
else
{
<label>No existem produtos em sua cesta de compras.</label>
}

29

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Executando:

Criando os mtodos na classe de controle para:


Aumentar Quantidade
Diminuir Quantidade
Remover Item
using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Web;
System.Web.Mvc;
Projeto.DAL.Entity; //entidades
Projeto.DAL.Persistence; //acesso a banco
Projeto.Web.Models; //classes de modelo..

namespace Projeto.Web.Controllers
{
public class ProdutoController : Controller
{
// GET: /Produto/Loja
public ActionResult Loja()
{
try
{
ProdutoDal d = new ProdutoDal(); //persistencia..
//executando a consulta e armazenando em um ViewBag..
ViewBag.Dados = d.FindAll();
}

30

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

catch(Exception e)
{
ViewData["Mensagem"] = e.Message;
}
return View();
}
// GET: /Produto/Cesta
public ActionResult Cesta()
{
return View();
}

[HttpGet] //recebe dados por URL


public ActionResult AdicionarItem(int id)
{
try
{
//Resgatar o produto no banco pelo id...
ProdutoDal d = new ProdutoDal(); //persistencia..
Produto p = d.FindById(id); //buscando 1 produto pelo id..
//criar um item da cesta de compras..
ItemCesta item = new ItemCesta();
item.Quantidade = 1;
item.Produto = p; //relacionando..
//criar a cesta de compras..
Cesta c = new Cesta();
if(Session["cesta"] != null) //se existe uma cesta em sesso..
{
//resgatando a cesta da sesso..
c = (Cesta) Session["cesta"];
}
else
{
c.Itens = new List<ItemCesta>();
}
//verificar se o produto ja existe como item da cesta..
//buscar o item dentro da cesta de compras..
ItemCesta itemExistente = c.Itens
.Where(i => i.Produto.IdProduto == id)
.FirstOrDefault();
if(itemExistente != null)
{
itemExistente.Quantidade++; //incremento..
}
else
{
c.Itens.Add(item); //adicionar produto..
}
//armazenar a cesta em sesso..
Session.Add("cesta", c);
}

31

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

catch(Exception e)
{
ViewData["Mensagem"] = e.Message;
}
return View("Cesta"); //nome da pgina
}

//Mtodo para aumentar a quantidade de um item da cesta..


[HttpGet] //resgatando dados pela URL..
public ActionResult AumentarQuantidade(int id)
{
//resgatar os dados da cesta em sesso...
Cesta c = (Cesta) Session["cesta"];
//verificar se o produto existe como item da cesta de compras
ItemCesta item = c.Itens.Where
(i => i.Produto.IdProduto == id).FirstOrDefault();
//verificar se o item foi encontrado..
if(item != null)
{
//aumentar a quantidade do produto..
item.Quantidade++;
}
return View("Cesta"); //nome da pgina..
}
//Mtodo para diminuir a quantidade de um item da cesta..
[HttpGet] //resgatando dados pela URL..
public ActionResult DiminuirQuantidade(int id)
{
//resgatar os dados da cesta em sesso...
Cesta c = (Cesta)Session["cesta"];
//verificar se o produto existe como item da cesta de compras
ItemCesta item = c.Itens.Where
(i => i.Produto.IdProduto == id).FirstOrDefault();
//verificar se o item foi encontrado..
if (item != null)
{
if(item.Quantidade > 1)
{
//aumentar a quantidade do produto..
item.Quantidade--;
}
}
return View("Cesta"); //nome da pgina..
}
//Mtodo para remover um item da cesta..
[HttpGet] //resgatando dados pela URL..
public ActionResult RemoverItem(int id)
{
//resgatar a cesta da sesso..
Cesta c = (Cesta) Session["cesta"];

32

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

//remover o item que tenha o id produto igual ao recebido..


c.Itens.RemoveAll(i => i.Produto.IdProduto == id);
return View("Cesta"); //nome da pgina..
}
}
}

Modelagem de dados (Venda de Produtos)

33

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Criando as tabelas:

go
create table Cliente(
IdCliente
integer
Nome
nvarchar(50)
Email
nvarchar(50)
Senha
nvarchar(40)
primary key(IdCliente))
go
create table Venda(
IdVenda
integer
DataVenda
date
Valor
decimal
Frete
decimal
PrazoEntrega
integer
IdCliente
integer
primary key(IdVenda),
foreign key(IdCliente) references

identity(1,1),
not null,
not null unique,
not null,

identity(1,1),
not null,
not null,
not null,
not null,
not null,
Cliente(IdCliente))

go
create table ItemVenda(
IdItemVenda
integer
identity(1,1),
Quantidade
integer
not null,
Valor
decimal
not null,
IdVenda
integer
not null,
IdProduto
integer
not null,
primary key(IdItemVenda),
foreign key(IdVenda) references Venda(IdVenda),
foreign key(IdProduto) references Produto(IdProduto))

34

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Executando:

Criando as classes de entidade:

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

namespace Projeto.DAL.Entity
{
public class Cliente
{

35

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

public virtual int IdCliente { get; set; }


public virtual string Nome { get; set; }
public virtual string Email { get; set; }
public virtual string Senha { get; set; }
}
}

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

namespace Projeto.DAL.Entity
{
public class Venda
{
public virtual int IdVenda { get; set; }
public virtual DateTime DataVenda { get; set; }
public virtual decimal Valor { get; set; }
public virtual decimal Frete { get; set; }
public virtual int PrazoEntrega { get; set; }
}
}

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

namespace Projeto.DAL.Entity
{
public class ItemVenda
{
public virtual int IdItemVenda { get; set; }
public virtual int Quantidade { get; set; }
public virtual decimal Valor { get; set; }
}
}

36

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Relacionando as entidades:

using
using
using
using
using

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

namespace Projeto.DAL.Entity
{
public class Cliente
{
public virtual int IdCliente { get; set; }
public virtual string Nome { get; set; }
public virtual string Email { get; set; }
public virtual string Senha { get; set; }
//Associao (TER-Muitos)
public virtual ICollection<Venda> Vendas { get; set; }
}
}
using
using
using
using
using

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

namespace Projeto.DAL.Entity
{
public class Venda
{
public virtual int IdVenda { get; set; }
public virtual DateTime DataVenda { get; set; }
public virtual decimal Valor { get; set; }
public virtual decimal Frete { get; set; }
public virtual int PrazoEntrega { get; set; }
//Relacionamentos:
public virtual Cliente Cliente { get; set; }
public virtual ICollection<ItemVenda> ItensVenda { get; set; }

}
}

37

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

using
using
using
using
using

Aula

21

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

namespace Projeto.DAL.Entity
{
public class ItemVenda
{
public virtual int IdItemVenda { get; set; }
public virtual int Quantidade { get; set; }
public virtual decimal Valor { get; set; }
//Relacionamentos..
public virtual Venda Venda { get; set; }
public virtual Produto Produto { get; set; }
}
}

using
using
using
using
using

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

namespace Projeto.DAL.Entity
{
public class Produto
{
public virtual int IdProduto
public virtual string Nome {
public virtual decimal Preco
public virtual string Foto {

{ get; set; }
get; set; }
{ get; set; }
get; set; }

//Relacionamento..
Public virtual ICollection<ItemVenda> ItemVenda { get; set; }
}
}

ORM Mapeamento Objeto Relacional


FluentNHibernate
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
FluentNHibernate.Mapping; //ORM (Mapeamento)
Projeto.DAL.Entity; //classes de entidade

namespace Projeto.DAL.Mapping
{
//Regra 1) Herdar de ClassMap e definir o tipo da entidade..

38

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

public class ProdutoMap : ClassMap<Produto>


{
//Regra 2) Definir um construtor e detalhar o mapeamento..
public ProdutoMap()
{
//Nome da tabela..
Table("Produto");
//Chave primria..
Id(p => p.IdProduto, "IdProduto").GeneratedBy.Identity();
//demais
Map(p =>
Map(p =>
Map(p =>

atributos..
p.Nome, "Nome").Length(50).Not.Nullable();
p.Preco, "Preco").Not.Nullable();
p.Foto, "Foto").Length(50).Not.Nullable().Unique();

}
}
}

using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
FluentNHibernate.Mapping; //mapeamento..
Projeto.DAL.Entity; //entidades..

namespace Projeto.DAL.Mapping
{
public class ClienteMap : ClassMap<Cliente>
{
public ClienteMap()
{
Table("Cliente"); //nome da tabela
//chave primria
Id(c => c.IdCliente, "IdCliente").GeneratedBy.Identity();

39

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

//demais
Map(c =>
Map(c =>
Map(c =>

Aula

21

atributos..
c.Nome, "Nome").Length(50).Not.Nullable();
c.Email, "Email").Length(50).Not.Nullable().Unique();
c.Senha, "Senha").Length(40).Not.Nullable();

}
}
}

using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
FluentNHibernate.Mapping; //ORM
Projeto.DAL.Entity; //entidades

namespace Projeto.DAL.Mapping
{
public class VendaMap : ClassMap<Venda>
{
public VendaMap()
{
Table("Venda");
Id(v => v.IdVenda, "IdVenda").GeneratedBy.Identity();
Map(v
Map(v
Map(v
Map(v

=>
=>
=>
=>

v.DataVenda, "DataVenda").Not.Nullable();
v.Valor, "Valor").Not.Nullable();
v.Frete, "Frete").Not.Nullable();
v.PrazoEntrega, "PrazoEntrega").Not.Nullable();

}
}
}

40

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

using
using
using
using
using
using
using

Aula

21

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
FluentNHibernate.Mapping; //ORM
Projeto.DAL.Entity; //entidades

namespace Projeto.DAL.Mapping
{
public class ItemVendaMap : ClassMap<ItemVenda>
{
public ItemVendaMap()
{
Table("ItemVenda");
Id(i => i.IdItemVenda, "IdItemVenda").GeneratedBy.Identity();
Map(i => i.Quantidade, "Quantidade").Not.Nullable();
Map(i => i.Valor, "Valor").Not.Nullable();
}
}
}

Mapeamento dos relacionamentos:


Venda com chave estrangeira para Cliente:
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
FluentNHibernate.Mapping; //ORM
Projeto.DAL.Entity; //entidades

41

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

namespace Projeto.DAL.Mapping
{
public class VendaMap : ClassMap<Venda>
{
public VendaMap()
{
Table("Venda");
Id(v => v.IdVenda, "IdVenda").GeneratedBy.Identity();
Map(v
Map(v
Map(v
Map(v

=>
=>
=>
=>

v.DataVenda, "DataVenda").Not.Nullable();
v.Valor, "Valor").Not.Nullable();
v.Frete, "Frete").Not.Nullable();
v.PrazoEntrega, "PrazoEntrega").Not.Nullable();

//Mapeamento da chave estrangeira...


References(v => v.Cliente).Column("IdCliente");
}
}
}

ItemVenda tem chave estrangeira para Venda e para Produto


using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
FluentNHibernate.Mapping; //ORM
Projeto.DAL.Entity; //entidades

namespace Projeto.DAL.Mapping
{
public class ItemVendaMap : ClassMap<ItemVenda>
{
public ItemVendaMap()
{
Table("ItemVenda");
Id(i => i.IdItemVenda, "IdItemVenda").GeneratedBy.Identity();
Map(i => i.Quantidade, "Quantidade").Not.Nullable();
Map(i => i.Valor, "Valor").Not.Nullable();
//Relacionamentos..
References(i => i.Venda).Column("IdVenda"); //FK
References(i => i.Produto).Column("IdProduto"); //FK
}
}
}

42

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Classes de persistncia:

using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
Projeto.DAL.Entity; //entidades
Projeto.DAL.Generics; //DAL Generico
Projeto.DAL.Util; //HibernateUtil

namespace Projeto.DAL.Persistence
{
public class ClienteDal : GenericDal<Cliente>
{
}
}

using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
Projeto.DAL.Entity;
Projeto.DAL.Generics;
Projeto.DAL.Util;

namespace Projeto.DAL.Persistence
{
public class VendaDal : GenericDal<Venda>
{
}
}

43

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

using
using
using
using
using
using
using
using

Aula

21

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
Projeto.DAL.Entity;
Projeto.DAL.Generics;
Projeto.DAL.Util;

namespace Projeto.DAL.Persistence
{
public class ItemVendaDal : GenericDal<ItemVenda>
{
}
}

Mapeamento das relaes que utilizam Collections


using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
FluentNHibernate.Mapping; //mapeamento..
Projeto.DAL.Entity; //entidades..

namespace Projeto.DAL.Mapping
{
public class ClienteMap : ClassMap<Cliente>
{
public ClienteMap()
{
Table("Cliente"); //nome da tabela
//chave primria

44

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Id(c => c.IdCliente, "IdCliente").GeneratedBy.Identity();


//demais
Map(c =>
Map(c =>
Map(c =>

atributos..
c.Nome, "Nome").Length(50).Not.Nullable();
c.Email, "Email").Length(50).Not.Nullable().Unique();
c.Senha, "Senha").Length(40).Not.Nullable();

//Mapeamento da collection..
//Inverse -> define que a chave estrangeira (KeyColumn)
//est localizada na classe definida pela collection
HasMany(c => c.Vendas).KeyColumn("IdCliente").Inverse();
}
}
}

using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
FluentNHibernate.Mapping; //ORM (Mapeamento)
Projeto.DAL.Entity; //classes de entidade

namespace Projeto.DAL.Mapping
{
//Regra 1) Herdar de ClassMap e definir o tipo da entidade..
public class ProdutoMap : ClassMap<Produto>
{
//Regra 2) Definir um construtor e detalhar o mapeamento..
public ProdutoMap()
{
//Nome da tabela..
Table("Produto");
//Chave primria..
Id(p => p.IdProduto, "IdProduto").GeneratedBy.Identity();
//demais
Map(p =>
Map(p =>
Map(p =>

atributos..
p.Nome, "Nome").Length(50).Not.Nullable();
p.Preco, "Preco").Not.Nullable();
p.Foto, "Foto").Length(50).Not.Nullable().Unique();

//Relacionamento muitos
HasMany(p => p.ItemVenda).KeyColumn("IdProduto").Inverse();
}
}
}

using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
FluentNHibernate.Mapping; //ORM

45

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

using Projeto.DAL.Entity; //entidades


namespace Projeto.DAL.Mapping
{
public class VendaMap : ClassMap<Venda>
{
public VendaMap()
{
Table("Venda");
Id(v => v.IdVenda, "IdVenda").GeneratedBy.Identity();
Map(v
Map(v
Map(v
Map(v

=>
=>
=>
=>

v.DataVenda, "DataVenda").Not.Nullable();
v.Valor, "Valor").Not.Nullable();
v.Frete, "Frete").Not.Nullable();
v.PrazoEntrega, "PrazoEntrega").Not.Nullable();

//Mapeamento da chave estrangeira...


References(v => v.Cliente).Column("IdCliente"); //FK
//Mapeamento da collection..
HasMany(v => v.ItensVenda).KeyColumn("IdVenda").Inverse();
}
}
}

Criando o link para autenticar


o cliente no momento da compra:
<div class="text-right">
<a href="/Cliente/Login" class="btn btn-success">
Finalizar Pedido
</a>
</div>

Criando o Controle para login de Clientes:

46

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

using
using
using
using
using

Aula

21

System;
System.Collections.Generic;
System.Linq;
System.Web;
System.Web.Mvc;

namespace Projeto.Web.Controllers
{
public class ClienteController : Controller
{
//pgina de login dos clientes..
public ActionResult Login()
{
return View();
}
}
}

47

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Classe de modelo para capturar


os dados do cliente para autenticao:
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Web;
System.ComponentModel.DataAnnotations;

namespace Projeto.Web.Models
{
public class ClienteLoginModel //formulrio..
{
[Required(ErrorMessage = "Por favor, informe seu email.")]
[Display(Name = "Endereo de Email:")] //label
public string Email { get; set; }
[Required(ErrorMessage = "Por favor, informe sua senha.")]
[Display(Name = "Senha de Acesso:")] //label
public string Senha { get; set; }
}
}

48

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Criando a pgina de login dos clientes:


@{
ViewBag.Title = "Login";
Layout = "~/Views/Shared/Layout.cshtml";
}
<div class="text-center">
<h3>Login de Clientes</h3>
Para finalizar a compra, informe seus dados.
<br /><br />
<div class="col-md-4 col-md-offset-4">
@model Projeto.Web.Models.ClienteLoginModel
@using(Html.BeginForm("AutenticarCliente", "Cliente", FormMethod.Post))
{
@Html.LabelFor(model => model.Email)
@Html.TextBoxFor(model => model.Email,
new { @class = "form-control" })
<br />
@Html.LabelFor(model => model.Senha)
@Html.PasswordFor(model => model.Senha,
new { @class = "form-control" })
<br />
<input type="submit" value="Acessar Conta"
class="btn btn-success btn-block" />
<hr />
@ViewData["Mensagem"]
}
</div>
</div>

49

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Implementando a autenticao do cliente:


Mtodo para autenticar clientes por email e senha:
using
using
using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
Projeto.DAL.Entity; //entidades
Projeto.DAL.Generics; //DAL Generico
Projeto.DAL.Util; //HibernateUtil
NHibernate;
NHibernate.Linq;

namespace Projeto.DAL.Persistence
{
public class ClienteDal : GenericDal<Cliente>
{
//Mtodo para retornar 1 Cliente pelo Email e Senha..
public Cliente Authenticate(string Email, string Senha)
{
//abrir conexo com o banco de dados..
using(ISession s = HibernateUtil.GetSessionFactory().OpenSession())
{
//LINQ - Language Integrated Query
//SQL -> select * from Cliente where Email = @v1 and Senha = @v2
var query = from c in s.Query<Cliente>()
where c.Email.Equals(Email) && c.Senha.Equals(Senha)
select c;
//retornar o cliente..
return query.FirstOrDefault();
}
}
}
}

@{
ViewBag.Title = "Login";
Layout = "~/Views/Shared/Layout.cshtml";
}
<div class="text-center">
<h3>Login de Clientes</h3>
Para finalizar a compra, informe seus dados.
<br /><br />
<div class="col-md-4 col-md-offset-4">
@model Projeto.Web.Models.ClienteLoginModel
@using(Html.BeginForm("AutenticarCliente", "Cliente", FormMethod.Post))
{
@Html.LabelFor(model => model.Email)
@Html.TextBoxFor(model => model.Email,

50

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

new { @class = "form-control" })


<br />
@Html.LabelFor(model => model.Senha)
@Html.PasswordFor(model => model.Senha,
new { @class = "form-control" })
<br />
<input type="submit" value="Acessar Conta"
class="btn btn-success btn-block" />
<hr />
@ViewData["Mensagem"]
<p>
<a href="/Cliente/Cadastro">Crie sua Conta</a>
</p>
}
</div>
</div>

Classe de Controle:
using
using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Web;
System.Web.Mvc;
Projeto.DAL.Entity; //entidades..
Projeto.DAL.Persistence; //acesso a banco..
Projeto.Web.Models; //classes de modelo..
System.Web.Security; //autenticao..

namespace Projeto.Web.Controllers
{
public class ClienteController : Controller
{
//pgina de login dos clientes..
public ActionResult Login()
{
return View();
}
//mtodo para autenticao dos usuarios..
[HttpPost] //recebe requisio de dados POST
public ActionResult AutenticarCliente(ClienteLoginModel model)
{
try
{
if(ModelState.IsValid) //validao..
{
ClienteDal d = new ClienteDal(); //persistencia..
Cliente c = d.Authenticate(model.Email, model.Senha);
if(c != null) //se o cliente foi encontrado..
{
//Gerar um Ticket de acesso para o cliente..

51

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

FormsAuthentication.SetAuthCookie(c.Email, false);
//armazenar o cliente em sesso..
Session.Add("cliente", c);
//redirecionar para a pgina de Compra..
return RedirectToAction("FinalizarCompra", "Venda");
}
else
{
ViewData["Mensagem"] = "Acesso Negado.";
}
}
}
catch(Exception e)
{
ViewData["Mensagem"] = e.Message;
}
return View("Login"); //nome da pgina..
}
}
}

Mapear no Web.config.xml o caminho


da pgina de Login de Clientes

<authentication mode="Forms">
<forms loginUrl="/Cliente/Login"/>
</authentication>
52

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Criando a Classe de Controle:

using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Web;
System.Web.Mvc;

53

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

namespace Projeto.Web.Controllers
{
[Authorize] //S permite usuarios autenticados..
public class VendaController : Controller
{
//pgina..
public ActionResult FinalizarCompra()
{
return View();
}
}
}

54

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

@{
ViewBag.Title = "FinalizarCompra";
Layout = "~/Views/Shared/Layout.cshtml";
}
<div class="text-center">
<h3>Finalizar Compra</h3>
<div class="col-md-6 col-md-offset-3">
<div class="panel panel-primary">
<div class="panel-heading">
Resumo da Compra
</div>
<div class="panel-body">
<strong>Dados do Cliente:</strong>
<hr />
@using Projeto.DAL.Entity
@{
Cliente c = (Cliente)Session["cliente"];
<label>Cdigo:</label> @c.IdCliente <br />
<label>Nome do Cliente:</label> @c.Nome <br />
<label>Endereo de Email:</label> @c.Email <br />
}
<br />
<strong>Dados da Compra:</strong>
<hr />
@using Projeto.Web.Models
@{
Cesta cesta = (Cesta)Session["cesta"];
<label>Total da Compra: </label>
@String.Format("{0:c}", cesta.ValorTotal) <br />
<label>Itens da Compra:</label> <br />
<table class="table table-hover">
<thead>
<tr>
<th>Foto</th>
<th>Nome do Produto</th>
<th>Preo</th>
<th>Quantidade</th>
<th>Total</th>
</tr>
</thead>
<tbody>
@foreach (ItemCesta item in cesta.Itens)
{
<tr>
<td>

55

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

<img src="/Imagens/@item.Produto.Foto"
width="50" height="50" />
</td>
<td>@item.Produto.Nome </td>
<td>@string.Format("{0:c}",
item.Produto.Preco) </td>
<td>@item.Quantidade </td>
<td>@string.Format("{0:c}", item.ValorTotal)
</td>
</tr>
}
</tbody>
</table>
}
</div>
</div>
</div>
</div>

56

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Executando:

57

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Finalizar Compra:

Redirecionando um cliente j autenticado direto


para a pgina de Finalizar Compra:

//pgina de login dos clientes..


public ActionResult Login()
{
//verificando se o cliente j est em sesso..
if(Session["cliente"] != null)
{
return RedirectToAction("FinalizarCompra", "Venda");
}
return View();
}

58

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Modelagem incluindo o Endereco do Cliente:

go
create table Endereco(
IdEndereco
integer
identity(1,1),
Logradouro
nvarchar(150)
not null,
Bairro
nvarchar(50)
not null,
Cidade
nvarchar(50)
not null,
Estado
nvarchar(50)
not null,
Cep
nvarchar(15)
not null,
IdCliente
integer
not null,
primary key(IdEndereco),
foreign key(IdCliente) references Cliente(IdCliente))

59

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Classe de entidade:

using
using
using
using
using

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

namespace Projeto.DAL.Entity
{
public class Endereco
{
public virtual int IdEndereco { get; set; }
public virtual string Logradouro { get; set; }
public virtual string Bairro { get; set; }
public virtual string Cidade { get; set; }
public virtual string Estado { get; set; }
public virtual string Cep { get; set; }
}
}

Classe de mapeamento:
/Mapping/EnderecoMap.cs
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
FluentNHibernate.Mapping; //ORM
Projeto.DAL.Entity; //entidades..

namespace Projeto.DAL.Mapping
{
public class EnderecoMap : ClassMap<Endereco>
{

60

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

//construtor..
public EnderecoMap()
{
Table("Endereco"); //nome da tabela..
//chave primria..
Id(e => e.IdEndereco, "IdEndereco").GeneratedBy.Identity();
//demais
Map(e =>
Map(e =>
Map(e =>
Map(e =>
Map(e =>

atributos / campos..
e.Logradouro, "Logradouro").Length(150).Not.Nullable();
e.Bairro, "Bairro").Length(50).Not.Nullable();
e.Cidade, "Cidade").Length(50).Not.Nullable();
e.Estado, "Estado").Length(50).Not.Nullable();
e.Cep, "Cep").Length(15).Not.Nullable();

//relacionamento..
//Endereco tem foreign key para Cliente..
References(e => e.Cliente).Column("IdCliente");
}
}
}

Classe de persistncia:

using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
Projeto.DAL.Generics;
Projeto.DAL.Entity;

namespace Projeto.DAL.Persistence
{
public class EnderecoDal : GenericDal<Endereco>
{
}
}

61

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Class Library para programas utilitrios


/Projeto.Util (Criptografia, Envio de Email, etc..)

using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
System.Security.Cryptography; //criptografia do .net

namespace Projeto.Util.Security
{
public class Criptografia
{

62

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

//Mtodo para gerar um hash MD5..


public static string GerarHashMD5(string valor)
{
//classe de criptografia..
MD5 md5 = new MD5CryptoServiceProvider();
//criptografando a senha e obtendo o seu hash em bytes..
byte[] hash = md5.ComputeHash(Encoding.UTF8.GetBytes(valor));
//converter o hash de bytes para string..
return BitConverter.ToString(hash).Replace("-", string.Empty);
}
}
}

Classe para envio de email...

using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
System.Net;
System.Net.Mail;

namespace Projeto.Util.Messages
{
public class EmailMessage
{
//parametros para o envio de email..
public string Destinatario { get; set; }
public string Assunto { get; set; }
public string Conteudo { get; set; }

63

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

//configuraes..
private readonly string Conta = "cotiexemplo@gmail.com";
private readonly string Senha = "@coticoti@";
private readonly string Smtp = "smtp.gmail.com";
private readonly int Porta = 587;
//mtodo para enviar a mensagem..
public void EnviarMensagem()
{
try
{
MailMessage msg = new MailMessage(Conta, Destinatario);
msg.Subject = Assunto;
msg.Body = Conteudo;
SmtpClient s = new SmtpClient(Smtp, Porta);
s.EnableSsl = true; //enviar email seguro..
s.Credentials = new NetworkCredential(Conta, Senha);
//mandar o email..
s.Send(msg);
}
catch(Exception e)
{
//retornar mensagem de erro..
throw new Exception("Erro ao enviar email: " + e.Message);
}
}
}
}

Adicionando referencia para o projeto Util

64

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Criando a pgina para cadastro dos clientes:

65

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Classe de modelo

using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Web;
System.ComponentModel.DataAnnotations;

namespace Projeto.Web.Models
{
public class ClienteCadastroModel
{
[Required(ErrorMessage = "Por favor, informe o nome.")]
[Display(Name = "Nome do Cliente:")]
public string Nome { get; set; }
[Required(ErrorMessage = "Por favor, informe o email.")]
[EmailAddress(ErrorMessage = "Por favor, informe um email correto.")]
[Display(Name = "Endereo de Email:")]
public string Email { get; set; }
[Required(ErrorMessage = "Por favor, informe a senha.")]
[Display(Name = "Senha de Acesso:")]
public string Senha { get; set; }
[Required(ErrorMessage = "Por favor, confirme a senha.")]
[Compare("Senha", ErrorMessage = "Por favor, informe a senha
corretamente.")]
[Display(Name = "Confirme sua Senha:")]
public string SenhaConfirm { get; set; }
[Required(ErrorMessage = "Por favor, informe o logradouro.")]
[Display(Name = "Logradouro:")]
public string Logradouro { get; set; }
[Required(ErrorMessage = "Por favor, informe o bairro.")]
[Display(Name = "Bairro:")]
public string Bairro { get; set; }

66

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

[Required(ErrorMessage = "Por favor, informe a cidade.")]


[Display(Name = "Cidade:")]
public string Cidade { get; set; }
[Required(ErrorMessage = "Por favor, informe o estado.")]
[Display(Name = "Estado:")]
public string Estado { get; set; }
[Required(ErrorMessage = "Por favor, informe o cep.")]
[Display(Name = "CEP:")]
public string Cep { get; set; }
}
}

Criando o formulrio:
@{
ViewBag.Title = "Cadastro";
Layout = "~/Views/Shared/Layout.cshtml";
}
<h3>Cadastro de Clientes</h3>
Para criar sua conta, informe os dados abaixo. <br />
<br /><br />
@model Projeto.Web.Models.ClienteCadastroModel
<div class="row">
@using(Html.BeginForm("CadastrarCliente", "Cliente", FormMethod.Post))
{
<div class="col-md-4">
<strong>Dados do Cliente</strong>
<hr />
@Html.ValidationSummary()
@Html.LabelFor(model => model.Nome) <br />
@Html.TextBoxFor(model => model.Nome,
new { @class = "form-control", @placeholder = "Digite aqui" })
<br />
@Html.LabelFor(model => model.Email) <br />
@Html.TextBoxFor(model => model.Email,
new { @class = "form-control", @placeholder = "Digite aqui" })
<br />
@Html.LabelFor(model => model.Senha) <br />
@Html.PasswordFor(model => model.Senha,
new { @class = "form-control", @placeholder = "Digite aqui" })
<br />
@Html.LabelFor(model => model.SenhaConfirm) <br />
@Html.PasswordFor(model => model.SenhaConfirm,
new { @class = "form-control", @placeholder = "Digite aqui" })
<br />
<input type="submit" value="Cadastrar Cliente"

67

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

class="btn btn-success btn-block" />


<br /><br />
<h3>@ViewData["Mensagem"]</h3>
</div>
<div class="col-md-4">
<strong>Endereo para Entrega</strong>
<hr />
@Html.LabelFor(model => model.Logradouro) <br />
@Html.TextAreaFor(model => model.Logradouro,
new { @class = "form-control", @placeholder = "Digite aqui" })
<br />
@Html.LabelFor(model => model.Bairro) <br />
@Html.TextBoxFor(model => model.Bairro,
new { @class = "form-control", @placeholder = "Digite aqui" })
<br />
@Html.LabelFor(model => model.Cidade) <br />
@Html.TextBoxFor(model => model.Cidade,
new { @class = "form-control", @placeholder = "Digite aqui" })
<br />
@Html.LabelFor(model => model.Estado) <br />
@Html.TextBoxFor(model => model.Estado,
new { @class = "form-control", @placeholder = "Digite aqui" })
<br />
@Html.LabelFor(model => model.Cep) <br />
@Html.TextBoxFor(model => model.Cep,
new { @class = "form-control", @placeholder = "Digite aqui" })
<br />
</div>
}
<div class="col-md-4">
<strong>Pesquisar Endereo:</strong>
<hr />
<form method="post" action="/Cliente/PesquisarEndereco">
<label>Informe o Cep de entrega:</label>
<input type="text" name="cep" class="form-control" />
<br />
<input type="submit" value="Pesquisar Endereo"
class="btn btn-primary btn-sm" />
</form>
</div>
</div>

68

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Executando:

https://github.com/

Repositorio para projetos utilizado para compartilhamento


de cdigo, versionamento de aplicaes, etc...

69

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

https://github.com/hamboldt/Correios.Net

Adicionando referencia para a biblioteca (.dll) do projeto...

70

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Criando a ao de Pesquisa de Endereo:


Classe de Controle (ClienteController)
using
using
using
using
using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Web;
System.Web.Mvc;
Projeto.DAL.Entity; //entidades..
Projeto.DAL.Persistence; //acesso a banco..
Projeto.Web.Models; //classes de modelo..
System.Web.Security; //autenticao..
Correios.Net; //biblioteca..
Projeto.Util.Security; //utilitarios..
Projeto.Util.Messages; //utilitarios..

namespace Projeto.Web.Controllers
{
public class ClienteController : Controller
{
//pgina de login dos clientes..
public ActionResult Login()
{
//verificando se o cliente j est em sesso..
if(Session["cliente"] != null)
{
return RedirectToAction("FinalizarCompra", "Venda");
}
return View();
}

//pgina de cadastro de clientes..


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

71

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

//pgina de cadastro de clientes..


[HttpPost] //recebe dados de um formulrio..
public ActionResult PesquisarEndereco(string cep)
{
ClienteCadastroModel model = new ClienteCadastroModel();
//buscar o endereo pelo endereo..
Address end = SearchZip.GetAddress(cep);
model.Logradouro = end.Street;
model.Bairro = end.District;
model.Cidade = end.City;
model.Estado = end.State;
model.Cep = end.Zip;
return View("Cadastro", model);
}
[HttpPost]
public ActionResult CadastrarCliente(ClienteCadastroModel model)
{
if(ModelState.IsValid) //passou nas validaes..
{
try
{
Cliente c = new Cliente(); //entidade..
Endereco e = new Endereco(); //entidade..
c.Nome = model.Nome;
c.Email = model.Email;
c.Senha = Criptografia.GerarHashMD5(model.Senha);
e.Logradouro = model.Logradouro;
e.Bairro = model.Bairro;
e.Cidade = model.Cidade;
e.Estado = model.Estado;
e.Cep = model.Cep;
e.Cliente = c; //relacionamento...
ClienteDal cd = new ClienteDal(); //persistencia..
cd.Insert(c); //gravando o cliente..
EnderecoDal ed = new EnderecoDal(); //persistencia..
ed.Insert(e); //gravando o endereco..
ViewData["Mensagem"] = "Cadastro realizado com sucesso.";
ModelState.Clear(); //limpar os campos do formulrio..
}
catch(Exception e)
{
//imprimir mensage de erro..
ViewData["Mensagem"] = e.Message;
}
}
return View("Cadastro");
}
//mtodo para autenticao dos usuarios..
[HttpPost] //recebe requisio de dados POST
public ActionResult AutenticarCliente(ClienteLoginModel model)

72

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

{
try
{
if(ModelState.IsValid) //validao..
{
ClienteDal d = new ClienteDal(); //persistencia..
Cliente c = d.Authenticate(model.Email, model.Senha);
if(c != null) //se o cliente foi encontrado..
{
//Gerar um Ticket de acesso para o cliente..
FormsAuthentication.SetAuthCookie(c.Email, false);
//armazenar o cliente em sesso..
Session.Add("cliente", c);
//redirecionar para a pgina de Compra..
return RedirectToAction("FinalizarCompra", "Venda");
}
else
{
ViewData["Mensagem"] = "Acesso Negado.";
}
}
}
catch(Exception e)
{
ViewData["Mensagem"] = e.Message;
}
return View("Login"); //nome da pgina..
}
}
}

73

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

using
using
using
using
using
using
using
using
using
using
using
using

Aula

21

System;
System.Collections.Generic;
System.Linq;
System.Web;
System.Web.Mvc;
Projeto.DAL.Entity; //entidades..
Projeto.DAL.Persistence; //acesso a banco..
Projeto.Web.Models; //classes de modelo..
System.Web.Security; //autenticao..
Correios.Net; //biblioteca..
Projeto.Util.Security; //utilitarios..
Projeto.Util.Messages; //utilitarios..

namespace Projeto.Web.Controllers
{
public class ClienteController : Controller
{
//pgina de login dos clientes..
public ActionResult Login()
{
//verificando se o cliente j est em sesso..
if(Session["cliente"] != null)
{
return RedirectToAction("FinalizarCompra", "Venda");
}
return View();
}

//pgina de cadastro de clientes..


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

74

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

//pgina de cadastro de clientes..


[HttpPost] //recebe dados de um formulrio..
public ActionResult PesquisarEndereco(string cep)
{
ClienteCadastroModel model = new ClienteCadastroModel();
//buscar o endereo pelo endereo..
Address end = SearchZip.GetAddress(cep);
model.Logradouro = end.Street;
model.Bairro = end.District;
model.Cidade = end.City;
model.Estado = end.State;
model.Cep = end.Zip;
return View("Cadastro", model);
}

[HttpPost]
public ActionResult CadastrarCliente(ClienteCadastroModel model)
{
if(ModelState.IsValid) //passou nas validaes..
{
try
{
Cliente c = new Cliente(); //entidade..
Endereco e = new Endereco(); //entidade..
c.Nome = model.Nome;
c.Email = model.Email;
c.Senha = Criptografia.GerarHashMD5(model.Senha);
e.Logradouro = model.Logradouro;
e.Bairro = model.Bairro;
e.Cidade = model.Cidade;
e.Estado = model.Estado;
e.Cep = model.Cep;
e.Cliente = c; //relacionamento...
ClienteDal cd = new ClienteDal(); //persistencia..
cd.Insert(c); //gravando o cliente..
EnderecoDal ed = new EnderecoDal(); //persistencia..
ed.Insert(e); //gravando o endereco..
ViewData["Mensagem"] = "Cadastro realizado com sucesso.";
ModelState.Clear(); //limpar os campos do formulrio..

EnviarEmailConfirmacao(c);
}
catch(Exception e)
{
//imprimir mensage de erro..
ViewData["Mensagem"] = e.Message;
}
}
return View("Login");
}

75

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

//mtodo pata enviar um email para o cliente..


private void EnviarEmailConfirmacao(Cliente c)
{
EmailMessage email = new EmailMessage();

email.Destinatario = c.Email;
email.Assunto = "Cadastro efetuado com sucesso - Loja Virtual";
email.Conteudo = "Seja bem vindo " + c.Nome
+ ", sua conta foi criada com sucesso.";

email.EnviarMensagem();
}

//mtodo para autenticao dos usuarios..


[HttpPost] //recebe requisio de dados POST
public ActionResult AutenticarCliente(ClienteLoginModel model)
{
try
{
if(ModelState.IsValid) //validao..
{
ClienteDal d = new ClienteDal(); //persistencia..
Cliente c = d.Authenticate(model.Email,
Criptografia.GerarHashMD5(model.Senha));
if(c != null) //se o cliente foi encontrado..
{
//Gerar um Ticket de acesso para o cliente..
FormsAuthentication.SetAuthCookie(c.Email, false);
//armazenar o cliente em sesso..
Session.Add("cliente", c);
//redirecionar para a pgina de Compra..
return RedirectToAction("FinalizarCompra", "Venda");
}
else
{
ViewData["Mensagem"] = "Acesso Negado.";
}
}
}
catch(Exception e)
{
ViewData["Mensagem"] = e.Message;
}
return View("Login"); //nome da pgina..
}
}
}

76

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Cliente cadastrado:

77

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Email recebido:

Consulta de Clientes por email:


using
using
using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
Projeto.DAL.Entity; //entidades
Projeto.DAL.Generics; //DAL Generico
Projeto.DAL.Util; //HibernateUtil
NHibernate;
NHibernate.Linq;

namespace Projeto.DAL.Persistence
{
public class ClienteDal : GenericDal<Cliente>
{
//Mtodo para retornar 1 Cliente pelo Email e Senha..
public Cliente Authenticate(string Email, string Senha)
{
//abrir conexo com o banco de dados..
using(ISession s = HibernateUtil.GetSessionFactory().OpenSession())
{
//LINQ - Language Integrated Query
//SQL -> select * from Cliente where Email = @v1 and Senha = @v2
var query = from c in s.Query<Cliente>()
where c.Email.Equals(Email) && c.Senha.Equals(Senha)
select c;

78

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

//retornar o cliente..
return query.FirstOrDefault();
}
}
//Mtodo para verificar se o email de um cliente ja existe
public bool HasEmail(string Email)
{
using(ISession s = HibernateUtil.GetSessionFactory().OpenSession())
{
var query = from c in s.Query<Cliente>()
where c.Email.Equals(Email)
select c;
if (query.Count() > 0)
return true; //email existe no banco..
else
return false; //email nao foi cadastrado..
}
}
}
}

No ClienteController:
[HttpPost]
public ActionResult CadastrarCliente(ClienteCadastroModel model)
{
if(ModelState.IsValid) //passou nas validaes..
{
try
{
ClienteDal cd = new ClienteDal(); //persistencia..
if (cd.HasEmail(model.Email)) //se o email ja existe!
{
throw new Exception("Email j est cadastrado.
Tente outro.");
}
Cliente c = new Cliente(); //entidade..
Endereco e = new Endereco(); //entidade..
c.Nome = model.Nome;
c.Email = model.Email;
c.Senha = Criptografia.GerarHashMD5(model.Senha);
e.Logradouro = model.Logradouro;
e.Bairro = model.Bairro;
e.Cidade = model.Cidade;
e.Estado = model.Estado;
e.Cep = model.Cep;
e.Cliente = c; //relacionamento...

79

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

cd.Insert(c); //gravando o cliente..


EnderecoDal ed = new EnderecoDal(); //persistencia..
ed.Insert(e); //gravando o endereco..
ViewData["Mensagem"] = "Cadastro realizado com sucesso.";
ModelState.Clear(); //limpar os campos do formulrio..
EnviarEmailConfirmacao(c);
return View("Login");
}
catch(Exception e)
{
//imprimir mensage de erro..
ViewData["Mensagem"] = e.Message;
}
}
return View("Cadastro");
}

Executando:

80

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

ReportViewer
Ferramenta da Microsoft para gerao
de relatrios em aplicaes .NET

Report Viewer for MVC

81

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

82

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

83

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

Adicionando os parmetros:

84

C# WebDeveloper
Domingo, 30 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

21

85

You might also like