ModelSQLBuilder 1.2.3

dotnet add package ModelSQLBuilder --version 1.2.3                
NuGet\Install-Package ModelSQLBuilder -Version 1.2.3                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ModelSQLBuilder" Version="1.2.3" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add ModelSQLBuilder --version 1.2.3                
#r "nuget: ModelSQLBuilder, 1.2.3"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install ModelSQLBuilder as a Cake Addin
#addin nuget:?package=ModelSQLBuilder&version=1.2.3

// Install ModelSQLBuilder as a Cake Tool
#tool nuget:?package=ModelSQLBuilder&version=1.2.3                

ModelSQLBuilder

ModelSQLBuilder facilita o uso de banco de dados sem o uso de um ORM.

Principais caracteristicas

  • Baseado em comandos SQL
  • Transparente, qualquer comando gerado pode ser acessado como string
  • Modular, as features podem ser usadas independentemente uma da outra

Porque Usar

O ModelSQLBuilder foi idealizado em um cenário de banco de dados caótico onde o uso de um ORM traria mais problemas do que soluções, esse cenário pode ser caracterizado por bancos de dados de sistemas que já se tornaram legados bem como por falta de documentação e manuais que expliquem as regras implementadas.

Nestes casos o mais comum é fazer o acesso escrevendo as querys manualmente e as utilizando no código da aplicação. Este é o problema que o ModelSQLBuilder resolve.

Como Utilizar

Um pacote do nuget esta disponível para download e uso em qualquer projeto C#, podendo ser encontrado através da ferramenta do visual studio, bem como através do comando do CLI do .net core.

Para iniciar o uso é necessário a criação de uma classe que sirva como modelo de dados para a implementação como por exemplo.

    public class People
    {
        public int Id {get; set;}
        public string FirstName {get; set;}
        public string Role {get; set;}
        public string CPF {get; set;}
        public string Document {get; set;}
        public DateTime BirdDate {get; set;}
        public Double Value {get; set;}
    }

É uma classe simples que guarda algumas informações sobre uma pessoa, agora devemos preparar esta classe simples para o uso da nossa biblioteca.

    [Entity("cbpessoa")]
    public class People : ModelBase<People>
    {
        [Field("id_cbpessoa", PostgreTypes.INT, true)]
        public int Id {get; set;}

        [Field("nome_str", PostgreTypes.STRING)]
        public string FirstName{get; set;}

        [Field("cargo_str", PostgreTypes.STRING)]
        public string Role{get; set;}

        [Field("cpf_str", PostgreTypes.STRING)]
        public string CPF {get; set;}

        [Field("rg_str", PostgreTypes.STRING)]
        public string Document{get; set;}

        [Field("data_nascimento",PostgreTypes.DATETIME)]
        public DateTime BirdDate{get; set;}

        [Field("value", PostgreTypes.DOUBLE)]
        public Double Value{get; set;}
    }

O que fizemos aqui foi adicionar alguns atributos e adicionar uma herança de `ModelBase<T> onde.

T é a nossa própria classe, dessa forma estamos dizendo a biblioteca qual o formato de dados estamos esperando na saida.

Os dois atributos adicionadas foram Entity para a classe, sinalizando o que vem a ser a nossa tabela, e Field em cada propriedade que representa um campo da tabela, vamos ver melhor os parâmetros que cada uma dos atributos recebe.

Entity

Este atributo serve apenas para classes e representa uma tabela do banco de dados ele recebe apenas um parâmetro string que é o nome da tabela a qual ele fará referência.

Field

Este atributo é mais complexo, ele pode receber até três parâmetros, em ordem

  • Nome.: O nome do campo assim como ele é no banco de dados na tabela em questão
  • Tipo.: O tipo do campo é uma sinalização onde o tipo do objeto em C# é sinalizado para a biblioteca através das constantes que a mesma disponibiliza, realizando assim uma "tradução" de tipos para os tipos do banco de dados
  • Chave.: Caso queira usar o campo como chave para esta tabela, independentemente de ele ser ou não uma Primary Key no banco de dados esse parâmetro deve ser true, caso contrário, pode ser omitido

Com a nossa classe preparada para representar uma tabela nós podemos começar a usufruir dos métodos que temos disponíveis no nosso ModelBase.

Podemos dividir a biblioteca em dois grupos, um grupo para abstrair o código SQL e outro para lidar com conexões, tratando-as automaticamente dentro de transações com using .

Abstraindo o SQL

Através dos métodos implementados no ModelBase podemos abstrair o código SQL conforme o exemplo abaixo.

    static void Main(string[] args)
    {
        var johnDoe = new People();
        johnDoe.Id = 156;
        johnDoe.FirstName = "John";
        johnDoe.Document = "12345678";
        johnDoe.CPF = "123456";
        johnDoe.BirdDate = DateTime.Now;
        johnDoe.Value = 2300.50;

        System.Console.WriteLine(johnDoe.BuildSelect());
        System.Console.WriteLine(johnDoe.BuildUpdate());
        System.Console.WriteLine(johnDoe.BuildWhereByKey());
        System.Console.WriteLine(johnDoe.BuildInsert());
        System.Console.WriteLine(johnDoe.BuildDelete());
    }

Através dos métodos apresentados acima temos acesso a string que representa o comando SQL desta forma podemos executa-lo utilizando qualquer biblioteca que queiramos.

Vamos analisar cada método independentemente.

BuildSelect

Esse método retorna a string do comando select sem where, caso seja preciso selecionar dados utilizando a chave como valor comparativo pode-se usar o método BuildWhereByKey que será explicado em detalhes mais adiante, caso seja preciso um where mais complexo o mesmo pode ser concatenado de dentro de uma string à saída do método.

Saída do método

    select
        nome_str,
        cpf_str,
        rg_str,
        data_nascimento,
        value,
        id_cbpessoa,
        cargo_str
    from cbpessoa

BuildUpdate

Esse método retorna a string do comando update contendo na cláusula where uma comparação de igualdade pelo campo determinado como chave no atributo field na classe que representa a tabela, caso seja preciso, embora não aconcelhável, é simples adicionar cláusulas ao where concatenando strings, bem como remover.

Saída do método

    update cbpessoa set
        nome_str = 'John',
        cargo_str = '',
        cpf_str = '123456',
        rg_str = '12345678',
        data_nascimento = '2019-05-25 10:37:04',
        value = 2300.5
    where id_cbpessoa = 156;

BuildWhereByKey

Este método constrói e retorna uma cláusula where simples através dos campos marcados como chave nos atributos da classe que representa a tabela em questão. Caso mais de um campo seja marcado como chave, mais condições serão acrescentadas à cláusula where utilizando o operador lógico and .

Saída do método

    where id_cbpessoa = 156;

BuildInsert

Constrói e retorna um comando de insert com os campos presentes na classe. Vale ressaltar que os campos marcados como chave não serão retornados no insert.

Saída do método


    insert into cbpessoa (
        nome_str,
        cargo_str,
        cpf_str,
        rg_str,
        data_nascimento,
        value
    ) values (
        'John',
        '',
        '123456',
        '12345678',
        '2019-05-25 10:37:04',
        2300.5
    );

BuildDelete

Monta um comando de delete com where seguindo as mesmas regras do método BuildWhereByKey

Saída do método

    delete
    from cbpessoa
    where id_cbpessoa = 156;
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.2.3 2,169 5/12/2019
1.2.2 611 5/3/2019
1.2.1 667 5/2/2019
1.2.0 574 4/28/2019
1.0.1 606 4/24/2019
1.0.0 595 4/19/2019