SlideShare uma empresa Scribd logo
1 de 31
Baixar para ler offline
ORM
@henriquericcio
Persistência
"Na ciência da computação, persistência refere
a característica de estado que sobrevive além
do processo no qual é criado. Sem esta
capacidade, o estado existirá apenas na
memória RAM, e pode se perder quando
ocorrer a interrupção da alimentação de
energia, como quando o computador é
desligado." - Wikipedia
Mundo OO
Persistência é uma necessidade primária de
aplicações. Em algum momento é necessário
armazenar dados, inclusive em aplicações OO.
Gerenciadores de Banco de Dados OO:
● Caché
● db4o
● ObjectDB
Realidade
● Persistência apoiada em gerenciadores não
OO, normalmente relacionais;
● Produtos e marcas fortes no mercado,
como: Microsoft SQL Server, Oracle,
MySQL;
● Legado: regras de negócio escritas para o
SGBD;
● Padronização da SQL;
● Investimentos altíssimos em SQL;
Solução
"Object-relational mapping (ORM, O/RM,
and O/R mapping) in computer software is a
programming technique for converting data
between incompatible type systems in object-
oriented programming languages. This
creates, in effect, a "virtual object database"
that can be used from within the programming
language. There are both free and
commercial packages available that perform
object-relational mapping, although some
programmers opt to create their own ORM
tools." - Wikipedia
Vantagens
● Um monte de tarefas relativas a banco de dados é feita
automaticamente.
● Nem todo mundo escreve bons codigos SQL, o ORM
escreve SQL padronizado.
● Iniciar transações, usar comandos preparados, etc é
simples como chamar um método.
● Se encaixa naturalmente ao estilo de código corrente.
● Abstrai o banco de dados.
● O model fica fracamente acoplado ao código de infra
para banco.
● Permite uso de vantagens OOP como herança no
model sem dor de cabeça.
Desvantagem
● Curva de aprendizado;
● Performance; (vs. master SQL dev)
Mapeamentos
São conhecidas as seguintes estratégias de
mapeamento:
● Propriedades
● Um para um;
● Um para muitos;
● Muitos para muitos;
● Componentes
● Herança;
Um para um
Um para muitos
Muitos para muitos
Herança
Estratégia 1
Single table per class hierarchy strategy
Uma única tabela mantém todas as instâncias da
hierarquia.
Estratégia 2
Joined subclass strategy
Uma tabela por classe e subclasse.
Cada tabela mantém as propriedades de uma subclasse
específica.
Estratégia 3
Table per class strategy
Uma tabela por classe concreta.
Outros aspectos
● Cascade
● Associação Unidirecional/Bidirecional
● Query Language
● Mapping
● Unit of work
● Lazy Load
● Query Object
Abordagens
● Model First
● Code First
● Data Base First
NHibernate
O NHibernate é um ORM Open-Source, que
surgiu através do Hibernate, voltado
exclusivamente para desenvolvedores Java,
sendo a princípio era um port do Hibernate,
mas passou a ser um projeto independente.
Sendo assim, apresenta uma certa maturidade,
principalmente por ser um framework com uma
equipe colaborando ativamente.
Mapping
● XML
● Atributos
● FluentNHibernate
● Code Mapping
XML
<hibernate-mapping>
<class entity-name="Customer">
<id name="id" type="long" column="ID">
<generator class="sequence"/>
</id>
<property name="name" column="NAME" type="string"/>
<property name="address" column="ADDRESS" type="string"/>
<many-to-one name="organization" column="ORGANIZATION_ID" class="Organization"/>
<bag name="orders" inverse="true" lazy="false" cascade="all">
<key column="CUSTOMER_ID"/>
<one-to-many class="Order"/>
</bag>
</class>
</hibernate-mapping>
Atributos
[Class(Schema = "dbo", Table = "`ProgramRequirements`")]
[Cache(1, Usage = CacheUsage.ReadWrite)]
public class ProgramRequirements : NhBase<ProgramRequirements>
{
[Id(Name = "Id", Column = "ID"), Generator(1, Class = "native")]
public virtual int Id { get; set; }
[ManyToOne(Column = "DeptID", OuterJoin = OuterJoinStrategy.False)]
public virtual Department Department { get; set; }
[ManyToOne(Column = "ProgID", OuterJoin = OuterJoinStrategy.False)]
public virtual Program Program { get; set; }
[Property(Column = "ProgReqTypeID")]
public virtual ProgramRequirementsType RequirementsType { get; set; }
[Property]
public virtual string Name { get; set; }
[Property]
public virtual string Description { get; set; }
}
Fluent NHibernate
public class PedidoMap : ClassMap<Pedido>
{
public PedidoMap()
{
Table("Orders");
Id(x => x.Id).Column("OrderID").Not.Nullable().GeneratedBy.Identity();
Map(x => x.DataPedido).Column("OrderDate");
Map(x => x.DataSolicitacao).Column("RequiredDate");
Map(x => x.DataEntrega).Column("ShippedDate");
Map(x => x.Frete).Column("Freight");
Map(x => x.NomeEntrega).Column("ShipName");
Map(x => x.EnderecoEntrega).Column("ShipAddress");
Map(x => x.CidadeEntrega).Column("ShipCity");
Map(x => x.RegiaoEntrega).Column("ShipRegion");
Map(x => x.CodigoPostalEntrega).Column("ShipPostalCode");
Map(x => x.PaisEntrega).Column("ShipCountry");
HasMany(x => x.Itens).KeyColumns.Add("OrderID", mapping => mapping.Name("OrderID").Not.Nullable());
References(x => x.Cliente).Columns("CustomerID").Cascade.None();
References(x => x.Empregado).Columns("EmployeeID").Cascade.None();
References(x => x.Entregador).Columns("ShipVia").Cascade.None();
}
}
Code Mapping
public class DogMap : ClassMapping<Dog>
{
public DogMap()
{
Table("Dog");
Id(x => x.Id, m => m.Generator(Generators.Identity));
Property(x => x.Name);
Property(x => x.Age);
}
}
Queries
● SQL Nativo
● HQL
● Criteria
● QueryOver
● Linq
SQL Nativo
IList cats = session.CreateSQLQuery(
"SELECT {cat.*} FROM CAT {cat} WHERE
ROWNUM<10",
"cat",
typeof(Cat)
).List();
HQL
IList cats = sess.Find( "from Cat as cat where
cat.Mate.Birthdate is null" );
Criteria
ICriteria crit = session.CreateCriteria(typeof(Cat));
crit.Add( Expression.Eq("color", Eg.Color.Black) );
crit.SetMaxResults(10);
IList cats = crit.List();
Query Over
IList<Cat> cats =
session.QueryOver<Cat>()
.Where(c => c.Name == "Max")
.List();
Linq
var user = from u in session.Query<User>()
where u.Username == username
select u;
var user = session.Query<User>().Where(u =>
u.Username == username);
NEXT!!!
Entity Framework
Recursos
Argumentos OODB vs RDB
http://stackoverflow.com/questions/800/object-oriented-vs-relational-databases
http://www.leavcom.com/db_08_00.htm
Sobre model/code/database first
http://social.msdn.microsoft.com/Forums/en-US/eb695b8b-0638-4181-aad5-
a0ab7a925779/which-one-to-chose-model-first-code-first-or-db-first
NHibernate Queries
http://stackoverflow.com/questions/3262642/nhibernate-hql-vs-criteriaapi-vs-queryover-vs-linq-
performance
Frameworks ORM para .Net
http://www.princiweb.com.br/blog/programacao/veja-o-que-e-orm-e-os-frameworks-disponiveis-
para-net/
Manual NHibernate
http://nhforge.org/doc/nh/en
Blog do Ayende
http://ayende.com/blog/

Mais conteúdo relacionado

Destaque

.NET Database Toolkit
.NET Database Toolkit.NET Database Toolkit
.NET Database Toolkitwlscaudill
 
Dapper & Dapper.SimpleCRUD
Dapper & Dapper.SimpleCRUDDapper & Dapper.SimpleCRUD
Dapper & Dapper.SimpleCRUDBlank Chen
 
C# 6.0 - What?! C# is being updated?
C# 6.0 - What?! C# is being updated?C# 6.0 - What?! C# is being updated?
C# 6.0 - What?! C# is being updated?Filip Ekberg
 
0. Course Introduction
0. Course Introduction0. Course Introduction
0. Course IntroductionIntro C# Book
 
14. Defining Classes
14. Defining Classes14. Defining Classes
14. Defining ClassesIntro C# Book
 
20. Object-Oriented Programming Fundamental Principles
20. Object-Oriented Programming Fundamental Principles20. Object-Oriented Programming Fundamental Principles
20. Object-Oriented Programming Fundamental PrinciplesIntro C# Book
 
17. Trees and Graphs
17. Trees and Graphs17. Trees and Graphs
17. Trees and GraphsIntro C# Book
 

Destaque (11)

.NET Database Toolkit
.NET Database Toolkit.NET Database Toolkit
.NET Database Toolkit
 
Dapper
DapperDapper
Dapper
 
Dapper & Dapper.SimpleCRUD
Dapper & Dapper.SimpleCRUDDapper & Dapper.SimpleCRUD
Dapper & Dapper.SimpleCRUD
 
C# 7
C# 7C# 7
C# 7
 
MVC - Introduction
MVC - IntroductionMVC - Introduction
MVC - Introduction
 
C# 6.0 - What?! C# is being updated?
C# 6.0 - What?! C# is being updated?C# 6.0 - What?! C# is being updated?
C# 6.0 - What?! C# is being updated?
 
0. Course Introduction
0. Course Introduction0. Course Introduction
0. Course Introduction
 
14. Defining Classes
14. Defining Classes14. Defining Classes
14. Defining Classes
 
08. Numeral Systems
08. Numeral Systems08. Numeral Systems
08. Numeral Systems
 
20. Object-Oriented Programming Fundamental Principles
20. Object-Oriented Programming Fundamental Principles20. Object-Oriented Programming Fundamental Principles
20. Object-Oriented Programming Fundamental Principles
 
17. Trees and Graphs
17. Trees and Graphs17. Trees and Graphs
17. Trees and Graphs
 

Semelhante a Treinamento ORM .Net

Uma implementação de suporte a
Uma implementação de suporte a Uma implementação de suporte a
Uma implementação de suporte a Rômulo Jales
 
Processos iniciais do mapeamento OR
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento ORNécio de Lima Veras
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
Criando Jogos 2D com Lua + Corona SDK
Criando Jogos 2D com Lua + Corona SDKCriando Jogos 2D com Lua + Corona SDK
Criando Jogos 2D com Lua + Corona SDKLeonardo Dalmina
 
Banco de dados orientados a objetos
Banco de dados orientados a objetos Banco de dados orientados a objetos
Banco de dados orientados a objetos Raquel Machado
 
Apresentação java
Apresentação javaApresentação java
Apresentação javamunosai
 
Google AppEngine: Desafios da adoção de cloud no mercado de seguros
Google AppEngine: Desafios da adoção de cloud no mercado de segurosGoogle AppEngine: Desafios da adoção de cloud no mercado de seguros
Google AppEngine: Desafios da adoção de cloud no mercado de segurosGustavo Concon
 
Palestra Zend Framework na Campus Party 2011
Palestra Zend Framework na Campus Party 2011Palestra Zend Framework na Campus Party 2011
Palestra Zend Framework na Campus Party 2011Flávio Lisboa
 
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGI
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGIFazendo Um Elefante Passar Debaixo da Porta - CONSEGI
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGIFabio Telles Rodriguez
 
Aulas Google Android
Aulas Google AndroidAulas Google Android
Aulas Google AndroidIury Teixeira
 
Paradigmas de Linguagens de Programação - Quatro Paradigmas + Ambientes de Pr...
Paradigmas de Linguagens de Programação - Quatro Paradigmas + Ambientes de Pr...Paradigmas de Linguagens de Programação - Quatro Paradigmas + Ambientes de Pr...
Paradigmas de Linguagens de Programação - Quatro Paradigmas + Ambientes de Pr...Adriano Teixeira de Souza
 
Utilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentesUtilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentesChristiano Anderson
 
Apresentação Banco de Dados - Caché
Apresentação Banco de Dados - CachéApresentação Banco de Dados - Caché
Apresentação Banco de Dados - CachéRenzo Petri
 
[DTC21] Lucas Gomes - Do 0 ao 100 no Big Data
[DTC21] Lucas Gomes - Do 0 ao 100 no Big Data[DTC21] Lucas Gomes - Do 0 ao 100 no Big Data
[DTC21] Lucas Gomes - Do 0 ao 100 no Big DataDeep Tech Brasil
 
Escalabilidade, as modas, (No)SQL
Escalabilidade, as modas, (No)SQLEscalabilidade, as modas, (No)SQL
Escalabilidade, as modas, (No)SQLFernando Ike
 
Bancos de dados open source
Bancos de dados open sourceBancos de dados open source
Bancos de dados open sourceRodrigo Aurélio
 

Semelhante a Treinamento ORM .Net (20)

Uma implementação de suporte a
Uma implementação de suporte a Uma implementação de suporte a
Uma implementação de suporte a
 
Processos iniciais do mapeamento OR
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento OR
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
Criando Jogos 2D com Lua + Corona SDK
Criando Jogos 2D com Lua + Corona SDKCriando Jogos 2D com Lua + Corona SDK
Criando Jogos 2D com Lua + Corona SDK
 
Banco de dados orientados a objetos
Banco de dados orientados a objetos Banco de dados orientados a objetos
Banco de dados orientados a objetos
 
Apresentação java
Apresentação javaApresentação java
Apresentação java
 
Google AppEngine: Desafios da adoção de cloud no mercado de seguros
Google AppEngine: Desafios da adoção de cloud no mercado de segurosGoogle AppEngine: Desafios da adoção de cloud no mercado de seguros
Google AppEngine: Desafios da adoção de cloud no mercado de seguros
 
ORM e EF
ORM e EFORM e EF
ORM e EF
 
Palestra Zend Framework na Campus Party 2011
Palestra Zend Framework na Campus Party 2011Palestra Zend Framework na Campus Party 2011
Palestra Zend Framework na Campus Party 2011
 
XML Schema (2002)
XML Schema (2002)XML Schema (2002)
XML Schema (2002)
 
Django
DjangoDjango
Django
 
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGI
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGIFazendo Um Elefante Passar Debaixo da Porta - CONSEGI
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGI
 
Aulas Google Android
Aulas Google AndroidAulas Google Android
Aulas Google Android
 
Paradigmas de Linguagens de Programação - Quatro Paradigmas + Ambientes de Pr...
Paradigmas de Linguagens de Programação - Quatro Paradigmas + Ambientes de Pr...Paradigmas de Linguagens de Programação - Quatro Paradigmas + Ambientes de Pr...
Paradigmas de Linguagens de Programação - Quatro Paradigmas + Ambientes de Pr...
 
Hibernate conceitos
Hibernate conceitosHibernate conceitos
Hibernate conceitos
 
Utilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentesUtilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentes
 
Apresentação Banco de Dados - Caché
Apresentação Banco de Dados - CachéApresentação Banco de Dados - Caché
Apresentação Banco de Dados - Caché
 
[DTC21] Lucas Gomes - Do 0 ao 100 no Big Data
[DTC21] Lucas Gomes - Do 0 ao 100 no Big Data[DTC21] Lucas Gomes - Do 0 ao 100 no Big Data
[DTC21] Lucas Gomes - Do 0 ao 100 no Big Data
 
Escalabilidade, as modas, (No)SQL
Escalabilidade, as modas, (No)SQLEscalabilidade, as modas, (No)SQL
Escalabilidade, as modas, (No)SQL
 
Bancos de dados open source
Bancos de dados open sourceBancos de dados open source
Bancos de dados open source
 

Treinamento ORM .Net

  • 2. Persistência "Na ciência da computação, persistência refere a característica de estado que sobrevive além do processo no qual é criado. Sem esta capacidade, o estado existirá apenas na memória RAM, e pode se perder quando ocorrer a interrupção da alimentação de energia, como quando o computador é desligado." - Wikipedia
  • 3. Mundo OO Persistência é uma necessidade primária de aplicações. Em algum momento é necessário armazenar dados, inclusive em aplicações OO. Gerenciadores de Banco de Dados OO: ● Caché ● db4o ● ObjectDB
  • 4. Realidade ● Persistência apoiada em gerenciadores não OO, normalmente relacionais; ● Produtos e marcas fortes no mercado, como: Microsoft SQL Server, Oracle, MySQL; ● Legado: regras de negócio escritas para o SGBD; ● Padronização da SQL; ● Investimentos altíssimos em SQL;
  • 5. Solução "Object-relational mapping (ORM, O/RM, and O/R mapping) in computer software is a programming technique for converting data between incompatible type systems in object- oriented programming languages. This creates, in effect, a "virtual object database" that can be used from within the programming language. There are both free and commercial packages available that perform object-relational mapping, although some programmers opt to create their own ORM tools." - Wikipedia
  • 6. Vantagens ● Um monte de tarefas relativas a banco de dados é feita automaticamente. ● Nem todo mundo escreve bons codigos SQL, o ORM escreve SQL padronizado. ● Iniciar transações, usar comandos preparados, etc é simples como chamar um método. ● Se encaixa naturalmente ao estilo de código corrente. ● Abstrai o banco de dados. ● O model fica fracamente acoplado ao código de infra para banco. ● Permite uso de vantagens OOP como herança no model sem dor de cabeça.
  • 7. Desvantagem ● Curva de aprendizado; ● Performance; (vs. master SQL dev)
  • 8. Mapeamentos São conhecidas as seguintes estratégias de mapeamento: ● Propriedades ● Um para um; ● Um para muitos; ● Muitos para muitos; ● Componentes ● Herança;
  • 13. Estratégia 1 Single table per class hierarchy strategy Uma única tabela mantém todas as instâncias da hierarquia.
  • 14. Estratégia 2 Joined subclass strategy Uma tabela por classe e subclasse. Cada tabela mantém as propriedades de uma subclasse específica.
  • 15. Estratégia 3 Table per class strategy Uma tabela por classe concreta.
  • 16. Outros aspectos ● Cascade ● Associação Unidirecional/Bidirecional ● Query Language ● Mapping ● Unit of work ● Lazy Load ● Query Object
  • 17. Abordagens ● Model First ● Code First ● Data Base First
  • 18. NHibernate O NHibernate é um ORM Open-Source, que surgiu através do Hibernate, voltado exclusivamente para desenvolvedores Java, sendo a princípio era um port do Hibernate, mas passou a ser um projeto independente. Sendo assim, apresenta uma certa maturidade, principalmente por ser um framework com uma equipe colaborando ativamente.
  • 19. Mapping ● XML ● Atributos ● FluentNHibernate ● Code Mapping
  • 20. XML <hibernate-mapping> <class entity-name="Customer"> <id name="id" type="long" column="ID"> <generator class="sequence"/> </id> <property name="name" column="NAME" type="string"/> <property name="address" column="ADDRESS" type="string"/> <many-to-one name="organization" column="ORGANIZATION_ID" class="Organization"/> <bag name="orders" inverse="true" lazy="false" cascade="all"> <key column="CUSTOMER_ID"/> <one-to-many class="Order"/> </bag> </class> </hibernate-mapping>
  • 21. Atributos [Class(Schema = "dbo", Table = "`ProgramRequirements`")] [Cache(1, Usage = CacheUsage.ReadWrite)] public class ProgramRequirements : NhBase<ProgramRequirements> { [Id(Name = "Id", Column = "ID"), Generator(1, Class = "native")] public virtual int Id { get; set; } [ManyToOne(Column = "DeptID", OuterJoin = OuterJoinStrategy.False)] public virtual Department Department { get; set; } [ManyToOne(Column = "ProgID", OuterJoin = OuterJoinStrategy.False)] public virtual Program Program { get; set; } [Property(Column = "ProgReqTypeID")] public virtual ProgramRequirementsType RequirementsType { get; set; } [Property] public virtual string Name { get; set; } [Property] public virtual string Description { get; set; } }
  • 22. Fluent NHibernate public class PedidoMap : ClassMap<Pedido> { public PedidoMap() { Table("Orders"); Id(x => x.Id).Column("OrderID").Not.Nullable().GeneratedBy.Identity(); Map(x => x.DataPedido).Column("OrderDate"); Map(x => x.DataSolicitacao).Column("RequiredDate"); Map(x => x.DataEntrega).Column("ShippedDate"); Map(x => x.Frete).Column("Freight"); Map(x => x.NomeEntrega).Column("ShipName"); Map(x => x.EnderecoEntrega).Column("ShipAddress"); Map(x => x.CidadeEntrega).Column("ShipCity"); Map(x => x.RegiaoEntrega).Column("ShipRegion"); Map(x => x.CodigoPostalEntrega).Column("ShipPostalCode"); Map(x => x.PaisEntrega).Column("ShipCountry"); HasMany(x => x.Itens).KeyColumns.Add("OrderID", mapping => mapping.Name("OrderID").Not.Nullable()); References(x => x.Cliente).Columns("CustomerID").Cascade.None(); References(x => x.Empregado).Columns("EmployeeID").Cascade.None(); References(x => x.Entregador).Columns("ShipVia").Cascade.None(); } }
  • 23. Code Mapping public class DogMap : ClassMapping<Dog> { public DogMap() { Table("Dog"); Id(x => x.Id, m => m.Generator(Generators.Identity)); Property(x => x.Name); Property(x => x.Age); } }
  • 24. Queries ● SQL Nativo ● HQL ● Criteria ● QueryOver ● Linq
  • 25. SQL Nativo IList cats = session.CreateSQLQuery( "SELECT {cat.*} FROM CAT {cat} WHERE ROWNUM<10", "cat", typeof(Cat) ).List();
  • 26. HQL IList cats = sess.Find( "from Cat as cat where cat.Mate.Birthdate is null" );
  • 27. Criteria ICriteria crit = session.CreateCriteria(typeof(Cat)); crit.Add( Expression.Eq("color", Eg.Color.Black) ); crit.SetMaxResults(10); IList cats = crit.List();
  • 28. Query Over IList<Cat> cats = session.QueryOver<Cat>() .Where(c => c.Name == "Max") .List();
  • 29. Linq var user = from u in session.Query<User>() where u.Username == username select u; var user = session.Query<User>().Where(u => u.Username == username);
  • 31. Recursos Argumentos OODB vs RDB http://stackoverflow.com/questions/800/object-oriented-vs-relational-databases http://www.leavcom.com/db_08_00.htm Sobre model/code/database first http://social.msdn.microsoft.com/Forums/en-US/eb695b8b-0638-4181-aad5- a0ab7a925779/which-one-to-chose-model-first-code-first-or-db-first NHibernate Queries http://stackoverflow.com/questions/3262642/nhibernate-hql-vs-criteriaapi-vs-queryover-vs-linq- performance Frameworks ORM para .Net http://www.princiweb.com.br/blog/programacao/veja-o-que-e-orm-e-os-frameworks-disponiveis- para-net/ Manual NHibernate http://nhforge.org/doc/nh/en Blog do Ayende http://ayende.com/blog/