Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
C# WebDeveloper
Domingo, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate
Aula
19
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
go
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>
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
19
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
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
<!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:
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
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
23
C# WebDeveloper
Domingo, 16 de Agosto de 2015
Desenvolvimento web com Asp.Net MVC
Acesso a banco de dados com FluentNHibernate
Aula
19
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();
}
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
}
}
}
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:
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();
}
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