Fala ai Radizeiro e Radizeira, tudo bem com você?
Chegamos ao episódio mais esperado, agora iremos começar a integrar o nosso projeto com o ORMBr, estarei mostrando como importar as entidades do ORMBr.
Dessa vez você irá preparar o seus sistema a estar hábito a abstrair a cada do banco de dados para o lógica interna dos seus software.
Se seu sistema hoje não tem essa abstração, com toda certeza, você tem perdido muito tempo, tenho sido taxativo nessa questão porque não aceito que você fique perdendo dias e mais dias tendo que implementar diversas coisas no seus sistema onde com apenas umas linhas de código você poderia ter resolvido.
Por este motivo me preocupo e me dispus a criar essa série especialmente para você, vamos mudar esse cenário nos seus softwares.
Agora que já temos toda a nossa conexão com o banco de dados pronta. Primeira coisa que devemos fazer é, lá no sample do ORMBr já tem uma pasta chamada models.
Que são as tabelas, ou seja, as entidades mapeadas do banco de dados SQLite que estou usando no nosso exemplo aqui no blog.
Neste ponto eu copio essas entidades e colo lá no meu projeto.
O ORMBr já faz esse mapeamento, se você já tem um banco de dados pronto, ele já tem um aplicativo que gera essas entidades mapeadas para você.
Aqui em nossa série de post de MVC com ORM não é o intuito de ensinar o ORMBr em si, mas mostrar a você a qualidade de código e de como utilizar em seus projetos com ORM.
Como estamos aqui mostrando um pequeno exemplo usando o ORMBr, e temos já o banco que acompanha o ORMBr, estaremos utilizando as entidades já mapeadas e com elas já inclusas em nosso projeto.
Veja como ficou organizado o meu projeto agora.
Agora você pode ver que toda minha tabela de banco esta mapeada com todas as particularidades que o ORMBr precisa.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293type
TMyEnum = (fmsEmitente, fmsTerceiros, fmsDestinatario, fmsSemFrete);
[Entity]
[Table(
'master'
,
''
)]
[PrimaryKey(
'master_id'
, AutoInc, NoSort,
True
,
'Chave primária'
)]
[Sequence(
'seq_master'
)]
[OrderBy(
'master_id'
)]
Tmaster =
class
private
{ Private declarations }
Fmaster_id:
Integer
;
Fdescription: Nullable<
String
>;
Fregisterdate: TDateTime;
Fupdatedate: TDate;
Fclient_id: Nullable<
Integer
>;
Fclient_name:
string
;
FEnumer: TMyEnum;
FInativo:
Boolean
;
Fdetail: TObjectList<Tdetail>;
Fclient: Tclient;
function
GetTotal:
Double
;
public
{ Public declarations }
constructor
Create;
destructor
Destroy; override;
[Restrictions([NoUpdate, NotNull])]
[Column(
'master_id'
, ftInteger)]
[Dictionary(
'master_id'
,
'Mensagem de validação'
,
''
,
''
,
''
,taCenter)]
property
master_id:
Integer
read Fmaster_id
write
Fmaster_id;
[Column(
'description'
, ftString,
60
)]
[Dictionary(
'description'
,
'Mensagem de validação'
,
''
,
''
,
''
,taLeftJustify)]
property
description: Nullable<
String
> read Fdescription
write
Fdescription;
[Restrictions([NotNull])]
[Column(
'registerdate'
, ftDateTime)]
[Dictionary(
'registerdate'
,
'Mensagem de validação'
,
'Date'
,
''
,
'!##/##/####;1;_'
,taCenter)]
property
registerdate: TDateTime read Fregisterdate
write
Fregisterdate;
[Restrictions([NotNull])]
[Column(
'updatedate'
, ftDate)]
[Dictionary(
'updatedate'
,
'Mensagem de validação'
,
'Date'
,
''
,
'!##/##/####;1;_'
,taCenter)]
property
updatedate: TDate read Fupdatedate
write
Fupdatedate;
// [Restrictions([NotNull])]
[Column(
'client_id'
, ftInteger)]
[ForeignKey(
'FK_IDCLIENT'
,
'client_id'
,
'client'
,
'client_id'
)]
[Dictionary(
'client_id'
,
'Mensagem de validação'
,
''
,
''
,
''
,taCenter)]
property
client_id: Nullable<
Integer
> read Fclient_id
write
Fclient_id;
[Enumeration(TEnumType
.
etInteger,
'0, 1, 2, 9'
)]
[Column(
'MyEnum'
, ftInteger)]
property
MyEnum: TMyEnum read FEnumer
write
FEnumer;
[Enumeration(TEnumType
.
etBoolean,
'0, 1'
)]
[Column(
'Inativo'
, ftBoolean)]
property
Inativo:
Boolean
read FInativo
write
FInativo;
[Restrictions([NoInsert, NoUpdate])]
[Column(
'client_name'
, ftString,
60
)]
[JoinColumn(
'client_id'
,
'client'
,
'client_id'
,
'client_name'
, InnerJoin)]
[Dictionary(
'Nome do Cliente'
,
''
)]
property
client_name:
string
read fclient_name
write
fclient_name;
[Association(OneToOne,
'client_id'
,
'client'
,
'client_id'
)]
property
client: Tclient read Fclient
write
Fclient;
[Association(OneToMany,
'master_id'
,
'detail'
,
'master_id'
)]
[CascadeActions([CascadeAutoInc, CascadeInsert, CascadeUpdate, CascadeDelete])]
property
detail: TObjectList<Tdetail> read Fdetail
write
Fdetail;
[Restrictions([NoInsert, NoUpdate])]
property
total:
Double
read GetTotal;
end
;
implementation
{ Tmaster }
constructor
Tmaster
.
Create;
begin
Fdetail := TObjectList<Tdetail>.Create;
Fclient := Tclient
.
Create;
end
;
destructor
Tmaster
.
Destroy;
begin
Fdetail
.
Free;
Fclient
.
Free;
inherited
;
end
;
function
Tmaster
.
GetTotal:
Double
;
var
iFor:
Integer
;
begin
Result :=
0
;
for
iFor :=
0
to
Fdetail
.
Count -
1
do
Result := Result + Fdetail
.
Items[iFor].price;
end
;
initialization
TRegisterClass
.
RegisterEntity(Tmaster);
Viu como começamos a ter um projeto bem estruturado e organizado? Você pode observar que fica mais fácil e simples as manutenções futuras. O que você está esperando em poder em poder aplicar em seus projetos?
Neste treinamento você vai aprender a aplicar técnicas que darão maior escalabilidade em seus softwares criando uma estrutura de forma prática e dinâmica, aplicando os padrões de boas práticas e clean code, além de compreender como aplicar os padrões de persistência de dados sem a necessidade de criar scripts de banco de dados.