Blog

All Blog Posts  |  Next Post  |  Previous Post

Curso Rápido TMS Aurelius - Primeiros Passos

Tuesday, February 26, 2013

Apesar do TMS Aurelius fornecer uma extensa documentação, às vezes recebemos pedidos para fornecer ainda mais exemplos, explicações, códigos-fonte sobre como realizar determinadas tarefas. E também, é claro, exemplos em português. Assim, iniciaremos aqui uma série de posts sobre como usar o TMS Aurelius. Tudo já está de alguma forma coberto pela documentação, mas aqui no blog tentaremos oferecer não informações muito técnicas, "oficiais", mas simplesmente explicar para que ele serve e fornecer exemplos de uso reais. Em resumo, uma forma alternativa de mostrar como usá-lo.

Começando pelo princípio, mostraremos uma pequena aplicação, mínima, usando o TMS Aurelius. Suponho que tenhamos uma classe de entidade TCustomer (cliente), mapeada da forma a seguir:
unit Customer;
interface
uses
  Aurelius.Mapping.Attributes;

type
  [Entity, Automapping]
  TCustomer = class
  private
    FId: integer;
    FName: string;
  public
    property Id: integer read FId write FId;
    property Name: string read FName write FName;
  end;

implementation
end.
O código-fonte a seguir mostra uma pequena aplicação que salva uma instância do cliente (classe TCustomer) em um banco de dados SQLite (removemos os blocos try..finally para simplificar o código):
program GettingStarted;

{$APPTYPE CONSOLE}

uses
  Aurelius.Drivers.Interfaces,
  Aurelius.Drivers.SQLite,
  Aurelius.Engine.DatabaseManager,
  Aurelius.Engine.ObjectManager,
  Aurelius.SQL.SQLite,
  Customer;

var
  Connection: IDBConnection;
  Manager: TObjectManager;
  Customer: TCustomer;
begin
  Connection := TSQLiteNativeConnectionAdapter.Create('test.db');
  Manager := TObjectManager.Create(Connection);
  Customer := TCustomer.Create;
  Customer.Name := 'First customer';
  Manager.Save(Customer);
  Manager.Free;
  WriteLn('Customer saved.');
  ReadLn;
end.
O objetivo aqui é mostrar o mínimo necessário para começar a usar o Aurelius. Eis o que você precisa:

1. A classe que será persistida. Nesse exemplo, a classe TCustomer.

2. Um mapeamento entre a classe e o banco de dados. Isso é obtido usando-se os atributos [Entity] e [Automapping]. Neste caso as propriedades são mapeadas automaticamente aos campos da tabela, mas você pode definir um mapeamento customizado se assim desejar. Chamaremos de "entidades" as instâncias dos objetos gerenciados pelo Aurelius.

3. Uma conexão ao banco de dados. No exemplo, é a variável Connection, que implementa a interface IDBConnection. Aqui nós estamos conectando a um banco SQLite local e precisamos usar o adapter TSQLiteNativeConnectionAdapter. Ou seja, sempre precisaremos de um adapter que faz a ponte entre o "mundo " do banco de dados relacionado e o "mundo" dos objetos. No Windows você deve se certificar que a dll sqlite3.dll está em um diretório que o Windows possa encontrá-la. No Mac OS X e no iOS, o SQLite já está disponível pelo sistema operacional.

4. Um object manager (gerenciador de objetos) para salvar e gerenciar suas entidads. A segunda linha do fonte cria um object manager, que salva os objetos no banco de dados especificado pela interface IDBConnection.

Ao final, o código simplesmente instancia um objeto TCustomer, preenche suas propriedades e o salva no banco de dados. Esta é a sua primeira aplicação com o TMS Aurelius!

Uma informação adicional: se o arquivo "test.db" não existir (nosso banco de dados), o Aurelius irá criar um banco vazio pra você (no caso to SQLite adapter apenas). Mas a estrutura das tabelas ainda não existe. Você pode explicitamente pedir ao Aurelius para criar a estrutura pra você (tabelas, campos, relacionamentos, etc.), usando o seguinte código:
procedure CreateDatabase(Connection: IDBConnection);
var
  DBManager: TDatabaseManager;
begin
  DBManager := TDatabaseManager.Create(Connection);
  DBManager.BuildDatabase;
  DBManager.Free;
end;
Isso irá criar o arquivo com o banco de dados e as tabelas necessários (neste caso, a tabela "Customer").

Wagner Landgraf




This blog post has received 4 comments.


1. Friday, June 28, 2013 at 10:47:38 AM

É possível criar indices para a tabela? Por exemplo nesse caso um idice chamado
INDICE_CUSTOMER_NOME para o campo nome.

Pergunto isso por que tenho um projeto em que preciso criar uma estrutura de tabelas independente do banco de dados, só que se não criar indices para determinados campos a busca vai ficar muito lenta.

Rodolfo


2. Monday, July 1, 2013 at 7:42:45 AM

Você pode criar um índice único, sim, usando o atributo [Unique]. O recurso para criar índices quaisquer, mesmo não único, apenas para performance, ainda não existe, mas será implementado, está no roadmap.

Wagner Landgraf


3. Friday, August 16, 2013 at 11:14:11 PM

Caro Wagner boa noite!

Estou estudando o Aurelius com a versão do Delphi XE4, baixei um exemplo da clube delphi edição 151 e estou tendo problemas quando trabalho com TObjectList da System.Generics.Collections.

Esse exemplo traz uma classe produto e estou o trecho de código abaixo para obter todos produtos cadastrados.

procedure TForm1.Button1Click(Sender: TObject);
var
s: ISession;
p: TObjectList<TProduto>;
begin
s := TService.GetSession;
p := s.ObjectManager.FindAll<TProduto>;
AureliusDataset1.SetSourceList(p);
AureliusDataset1.open;
end;

Quando clico no botão o aurelius faz a pesquisa e chega a trazer os dados mas, ao utilizar o aureliusdataset com um datasource e uma grid estou recebendo uma serie de AV''s.

Estou montando um projeto onde varei um servidor datasnap com o aurelius e firedac, estou tendo dificuldades para encontrar exemplos dessa arquitetura além de informações sobre performace e segurança e número de usuários simultâneos.

Pretendo comprar uma licença "site" do aurelius mas, essa questões estão travando o negócio. Um ponto muito importante para nós é o TMS Data Modeler que atualmente não é compatível com PostGreSQL.

Enviei um e-mail para o grupo NDDV do yahoo com o seguinte titulo "Arquitetura de servidor com REST/JSON/ORM" e um dos colegas contribuiu com os seguintes dizeres

"Aurelius da problemas com o Datasnap justamente pelo fato dos metodos ser Stateless" isso procede?

Aguardo o seu retorno e conto com a sua colaboração.




André Geraldo dos Santos


4. Sunday, August 18, 2013 at 3:20:20 PM

André,

sugiro que mande um e-mail diretamente pra mim (pode enviar pela aba "Suporte" do site da TMS que rapidamente chega pra mim e eu te respondo) para tratarmos de detalhes técnicos, já que com as informações acima ainda não consigo te identificar a fonte do problema. Só pra adiantar, o teu GetSession traz uma interface já criada ou cria na hora? Porque lembre-se que se você destruir o object manager os objetos serão destruídos e claro que o AureliusDataset estará manipulando objetos destruídos. Ou deixe o seu ObjectManager criado ou ajuste a propriedade OwnsObjects pra false para que ele não destrua os objetos obtidos do servidor.
Sobre a questão do stateless, eu respondi no próprio grupo, podemos continuar também a discussão por lá.

Wagner Landgraf




Add a new comment

You will receive a confirmation mail with a link to validate your comment, please use a valid email address.
All fields are required.



All Blog Posts  |  Next Post  |  Previous Post