O documento discute ORM (Object Relational Mapping), definindo-o como uma técnica para mapear objetos e dados relacionais. Ele descreve o problema de mapear tipos não escalares de linguagens orientadas a objetos para tipos escalares de SQL. Em seguida, apresenta Hibernate, NHibernate e Fluent NHibernate como soluções ORM para .NET, e fornece instruções passo a passo para começar a usar Fluent NHibernate em um projeto C#.
2. Definição de ORM
• Object Relational Mapping framework, which (as ORM states) maps
between relational data and objects
• Technique for converting data between incompatible type
systems in object-oriented programming languages.
3. O problema
• Linguagens OO - Orientado à Objetos - Tipos não escalares
• Linguagem SQL – Linguagem Estruturada - Tipos escalares
4. O problema
• Tipo escalar: Armazena um único tipo de valor associado a um
símbolo.
Exemplo:
int peopleId = 1;
string peopleName = “Carlos”;
string phoneNumber = “011 3044-4292”
Mesmo que usado uma array geralmente essa array seria tipada: string[] people = {“Carlos”, “Maria”}
5. O problema
• Tipo nao escalar: Armazena mais de um tipo de valor associado a
um simbolo.
Exemplo:
People people= new People();
people.id = 1;
people.name = “Carlos”;
people.phones = new List<PhoneNumber>().add(new PhoneNumber(){number=“011-30444292”});
6. O problema
• String SQL
Linguagem estruturada:
int peopleId = 1;
string peopleName = “Carlos”;
string phoneNumber = “011 3044-4292”
Repository.People.Save(peopleId,peopleName);
Insert Into People(id,name) Values(@peopleId, @peopleName);
Repository.PhoneNumber.Save(peopleId,phoneNumber);
Insert Into PhoneNumber(peopleId,number) Values(@peopleId,
@phoneNumber);
Linguagem OO:
People people= new People();
people.id = 1;
people.name = “Carlos”;
people.phones = new List<PhoneNumber>()
.add(new PhoneNumber (“011-30444292”);
Repository.People.Save(people);
Insert Into People(id,name) Values(@people.Id, @people.name);
Repository.PhoneNumber.Save(people);
Insert Into PhoneNumber(peopleId,number) Values(@people.id,
@people.phones[0]);
7. A solução
• Persistências dos objetos
Repository.People.Save(people);
Repository.PhoneNumber.Save(people.phoneNumber);
TblPeople
People
TblPhoneNumber
PhoneNumber
ORM
DBMS
OO APP
Insert Into People(id,name) Values(@people.Id, @people.name);
Insert Into PhoneNumber(peopleId,number) Values(@people.id,
@people.phones[0]);
HQL
SQL
insert into PhoneNumber (peopleId, number) select p.id,
@people.phoneNumber[0] from Pessoa p where p.id =
@people.id
8. Hibernate, Nhibernate e Fluent NHibernate
• Hibernate ORM enables developers to more easily write applications whose data outlives the application
process. As an Object/Relational Mapping (ORM) framework, Hibernate is concerned with data persistence
as it applies to relational databases (via JDBC).
• NHibernate is a mature, open source object-relational mapper for the .NET framework. It's actively
developed, fully featured and used in thousands of successful projects.
• Fluent NHibernate offers an alternative to NHibernate's standard XML mapping files. Rather than writing
XML documents (.hbm.xml files), Fluent NHibernate lets you write mappings in strongly typed C# code. This
allows for easy refactoring, improved readability and more concise code.
10. Baby Steps in C#
Criação de um projeto simples
- Utilize os padrões de projeto que melhor atenda a sua necessidade]
- Uma console application pode facilitar o seu estudo
Console App
Source from:
https://github.com/aragostinho/FluentGenericDao
11. Baby Steps in C#
Instale o projeto usando o Nuget
• PM> Install-Package FluentNHibernate
12. Baby Steps com C#
Crie e mapeie suas entidades
• Crie uma camada para que possa armazenar suas entidades e mapeamentos
• Comece com ao menos uma entidade simples. Isso irá facilitar para que possa testar toda a configuração
Entidade “Task” Mapeamento “TaskMasp”
Camada Domain
13. Baby Steps in C#
Implemente a classe SessionFactory do NHibernate
• Crie uma camada para que possa armazenar classes relevantes ao seu repositório de dados
• Existem N formas de implementar a SessionFactory, cada implementação especifica para cada tipo de bando de dados.
Camada Repository
Exemplo de classe estática “FluentHibernateHelper”
14. Baby Steps in C#
Implemente a classe SessionFactory com MySql
• No exemplo usamos o banco de dados MySql. Instale o MySql Data
PM> Install-Package MySql.Data
Camada Repository
15. Baby Steps in C#
Implemente uma camada Business (recomendado)
• Como boa prática é recomendado que se crie uma camada para armazenar suas classes negócios
as quais farão comunicação entre o seu repositório e as entidades do seu domínio.
• Utilize os padrões de projeto que melhor se adequam ao seu projeto: Factory, Singleton, Generics....
• O Fluent já fornece métodos CRUD, mas como boa prática é recomendado que você cria uma interface DAO e uma
classe abstrata para que possa “enriquecer” suas classes de negócios através de herança e reescrita de métodos.
Camada Business
Exemplo de classe abstrata “AbstractGenericDao<T>”
16. Baby Steps in C#
Utilizando classes de negócios na sua aplicação
• Como resultado final a utilização de sua classes de negócios na sua aplicação deve proporcionar facilidade
para codificação e chamada dos métodos CRUD e ser 100% independente das informações de seu repositório.
Console App