EF Core 2.1 - Conversão de valores - II


  Hoje vou apresentar um exemplo de como usar conversão de valores, o novo recurso do EF Core 2.1.

Os conversores de valores são um novo recurso do EF Core 2.1 e permitem que os valores das propriedades sejam convertidos durante a leitura ou gravação no banco de dados.

Eu já apresentei o recurso neste artigo : EF Core 2.1 - Conversão de valores

Neste artigo veremos mais um exemplo de conversão usando a classe ValueConverter e o método HasConversion().

Definindo o cenário

Vejamos um exemplo prático onde vamos cifrar um texto e gravar no banco de dados e decifrar o valor quando o dado for lido do banco de dados.

Vamos supor que já temos um banco de dados chamado ABDemoDB e uma tabela Usuarios com a seguinte estrutura:

Abaixo vemos o script SQL para criar a tabela Usuarios:

USE [ABDemoDB]
GO
CREATE TABLE [dbo].[Usuarios](
	[UsuarioId] [int] IDENTITY(1,1) NOT NULL,
	[Nome] [nvarchar](100) NOT NULL,
	[Senha] [nvarchar](250) NOT NULL,
    CONSTRAINT [PK_Usuarios] PRIMARY KEY CLUSTERED 
    (
    	[UsuarioId] ASC
    )
);

Criando o projeto no VS 2017

Abra o VS 2017 Community e crie um novo projeto .NET Core do tipo Console App(.NET Core) chamado EFCore_Converter.

Inclua no projeto a referência para o Microsoft.EntityFrameworkCore.SqlServer :

Observe que estou usando a versão 2.21, que é a versão mais estável, mas podemos usar a versão 2.1 ou superior.

Crie no projeto a pasta Model e nesta pasta inclua duas classes:

  1. Usuario  - classe de domínio
  2. AppDbContext - classe de contexto

1- Usuario

    public class Usuario
    {
        public int UsuarioId { get; set; }
        public string Nome { get;  set; }
        public string Senha { get; set; }
   }

2- AppDbContext

using Microsoft.EntityFrameworkCore;
using System;
using System.Text;

namespace EFCore_Converter.Model
{
    public class AppDbContext : DbContext
    {
        public DbSet<Usuario> Usuarios { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Data Source=Macoratti;Initial Catalog=ABDemoDB;Integrated Security=True");
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
           modelBuilder.Entity<Usuario>()
             .Property(p => p.Senha)
              .HasConversion(
                from => Convert.ToBase64String(Encoding.UTF8.GetBytes(from)),
                to => Encoding.UTF8.GetString(Convert.FromBase64String(to))).HasMaxLength(250);

        }
    }
}

No método OnModelCreating usamos o método HasConversion() na propriedade Senha da entidade Usuario e estamos definindo a conversão cifrando o texto para salvar no banco de dados e decifrando o valor da coluna Senha quando formos ler a informação.

Agora vamos ver a conversão funcionando...

No arquivo Program.cs inclua o código abaixo:

using EFCore_Converter.Model;
using static System.Console;
namespace EFCore_Converter
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var contexto = new AppDbContext())
            {
                IncluiUsuario(contexto);
                ListaUsuarios(contexto);
                ReadLine();
            }
        }
        private static void ListaUsuarios(AppDbContext contexto)
        {
            foreach (var usuario in contexto.Usuarios)
            {
                WriteLine($"{usuario.Nome,10} {usuario.Senha, 30}");
            }
        }
        private static void IncluiUsuario(AppDbContext contexto)
        {
            var novoUsuario = new Usuario
            {
                Nome = "Mariana",
                Senha = "#TextoDaSenha@"
            };
            contexto.Add(novoUsuario);
            contexto.SaveChanges();
        }
    }
}

No código acima temos o método IncluiUsuario() que inclui um novo usuário, e que esta atribuindo o valor da senha na propriedade Senha do modelo.

Graças ao novo recurso do EF Core a conversão é feita durante a inclusão, onde o texto é cifrado, e quando a informação for lida, ela é decifrada.

Veja o resultado da execução a seguir:

Após incluir o novo usuário espiando a tabela Usuarios no banco de dados veremos a senha cifrada:

Para exibir as informações a coluna Senha é lida e decifrada exibindo o valor original:

Pegue o código completo do projeto aqui:  EFCore_Converter.zip

"Porque Deus não nos destinou para a ira, mas para a aquisição da salvação, por nosso Senhor Jesus Cristo."

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti