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.

type
    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.

CLIQUE AQUI E SAIBA MAIS SOBRE O TREINAMENTO COMO IMPLEMENTAR ORM EM ARQUITETURA MVC