Sei sulla pagina 1di 30

C# WebDeveloper

Domingo, 16 de Agosto de 2015


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

Aula

19

Criando o Projeto MVC

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

Aula

19

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

Aula

19

Data Access Layer (DAL)


Camada de acesso a dados

Estrutura do projeto:

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

Aula

19

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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

\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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

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, 16 de Agosto de 2015


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

19

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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

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, 16 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

19

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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

Adicionando referencia no
Projeto Web para a camada DAL:

12

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

Aula

19

Instalando o bootstrap:

13

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

Aula

19

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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

</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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

using
using
using
using
using

Aula

19

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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

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

17

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

Aula

19

@{
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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

Modelagem da Cesta de Compras:

Criando as classes de modelo:

21

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

using
using
using
using
using

Aula

19

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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

<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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

}
//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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

<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, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate

Aula

19

Executando:

Continua...

30

Potrebbero piacerti anche