ASP.NET Core 2.0 + Entity Framework Core + Sqlite

O objetivo deste artigo é demonstrar como criar uma aplicação simples e rápida utilizando o ASP.NET CORE com o Entity Framework Core em uma base de dados SQLite.

Vamos ver como gerar o projeto, como incluir as dependências necessárias e como trabalhar com o Migrations para criar e alterar o banco de dados.

A ideia do projeto é criar um CRUD básico, mostrando informações de desenhos animados. Neste exemplo usei o site da varievo como fonte de dados. Veja o projeto final na imagem abaixo:

Imagem6

O SQLite para quem não conhece é um pequeno banco de dados open source, utilizado constantemente em aplicações mobile, ao meu ver a grande vantagem dele é poder ser entregue junto com a aplicação. Para projetos pequenos sem complexidade ele cai muito bem.

Eu gosto de utilizar o SQLite principalmente quando estou fazendo protótipos de sistemas, algo que tenha que apresentar ou como tutoriais como esse e também nos meus projetos de desenvolvimento mobile.

Para gerenciar uma base de dados SQLite vc pode usar varias ferramentas que existem por ae, eu costumo usar o SQLiteBrowser disponível neste link, mas caso não queira baixar nenhum executável para essa tarefa, utilize a extensão para o Firefox que pode ser obtida neste link.

Imagem9

Falando um pouco sobre o Entity Framework Core, pelo que tenho acompanhado é a versão mais leve, extensível, performática  e multiplataforma do Entity Framework. Eu gosto muito de usar o Dapper para acessar os dados, pois ele possui mais performance e gosto de ter os “comandos sql” na minha mão para customizar, para determinados projetos pode ser o ideal.

Mas estou acompanhado alguns artigos pela internet sobre benchmarks entre as duas tecnologias (EF CORE x DAPPER), e o EF Core pelo visto melhorou em muito a questão de performance e em alguns casos sendo até melhor que o Dapper, pretendo fazer um artigo no futuro sobre esse tema.

Neste exemplo vamos utilizar a abordagem code first ou seja vamos criar nossa entidade(classe) e deixar a cargo do EF Core criar a estrutura de banco e possíveis alterações com a ajuda do Migrations.

O Migrations é uma funcionalidade do EF que permite que você crie atualizações gerenciáveis para seu banco de dados ou optar que ele cuide de tudo de forma automática. A ideia principal de trabalhar com EF Core utilizando a abordagem Code First junto com Migrations é que essas tecnologias mantenham o banco atualizado sempre que seu domínio (classes) for alterado.

Vamos usar o Visual Studio 2017 para este exemplo, e os comandos para a utilização do Migrations vamos usar o dotnet cli, esses comandos podem ser executados no Package Manager Console caso prefiram.

Crie um projeto do tipo “Web Application (Model-View-Controller)” lembre-se de setar o projeto para .NET Core e ASP.NET Core 2.0.

Imagem1

Com o projeto criado o primeiro passo é adicionar as dependências via Nuget dos seguintes pacotes:

Microsoft.EntityFrameworkCore.Sqlite
Microsoft.EntityFrameworkCore.Sqlite.Design
Microsoft.EntityFrameworkCore.Tools

Imagem2

Depois de instaladas as dependências vamos criar duas classes na pasta Models:

Person.cs

public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string Creator { get; set; }
public int YearCreation { get; set; }
public string Description { get; set; }
}

PersonContext.cs

public class PersonContext: DbContext
{
   public PersonContext(DbContextOptions<PersonContext>
options) : base(options)
   {
   }
   public DbSet<Person> Persons { get; set; }
   protected override void OnModelCreating(ModelBuilder builder)
   {
     builder.Entity<Person>().HasKey(m => m.Id);
     base.OnModelCreating(builder);
   }
}

A classe Person.cs não tem o campo para guardar o caminho da imagem, neste momento de propósito para mostrar como fazer o update do banco daqui a pouco.

Vamos alterar agora a classe Startup.cs inserindo no método ConfigureServices o seguinte comando:

public void ConfigureServices(IServiceCollection services)
{
   var connection = Configuration["ConexaoSqlite:SqliteConnectionString"];
   services.AddDbContext<PersonContext>(options =>
             options.UseSqlite(connection)
   );
   // Add framework services.
  services.AddMvc();
}

No comando acima estamos utilizando o container de injeção de dependência nativa do .NET Core para injetar a classe de contexto e pegar a string de conexão do SQLite.

Para configurar a string de conexão abra o arquivo appsettings.json e insira o seguinte comando:

{
  "ConexaoSqlite": {
    "SqliteConnectionString": "Data Source=Personagens.db"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}

Depois de criar essas classes vamos criar o banco com o Migrations, neste exemplo eu fiz essa operação via linha de comando, para isso eu utilizei o PowerShell, você pode usar o prompt de comando que preferir.

Abra o seu comand preferido dentro da pasta do projeto e digite o seguinte comando:

dotnet ef migrations add InitialMigration

Este comando irá criar o migrations inicial da aplicação, logo depois digite o seguinte comando:

dotnet ef database update

O comando acima aplica a migração do banco de dados.

Após esses comandos se voltar a solution verá que a operação criou uma pasta chamada “Migrations” no seu projeto, com duas classes que o Migrations utiliza para o controle.

Verifique também que foi criado o arquivo Personagens.db que é o nosso banco de dados do SQLite.

Vamos agora criar um controller para as operações de CRUD, para isso vá na pasta Controllers e insira um controller novo como na imagem abaixo:

Imagem5

Com esse passo feito, basta compilar a aplicação e rodar, se tudo saiu ok, o aplicativo deve estar funcionando.

No primeiro momento não teremos nada cadastrado, clique no link “create new” e comece a cadastrar seus personagens.

Na classe Person.cs que coloquei acima não tinha colocado de propósito um campo para guardar o caminho da imagem do personagem, vamos agora criar esse campo e usar o Migrations para realizar a alteração no banco de dados.

Para isso inclua na classe Person.cs o campo:

public string ImageUrl { get; set; }

Imagem7

Abra novamente um prompt de comando no diretório da aplicação e digite os seguintes comandos:

dotnet ef migrations add IncludeImageUrlMigration

e depois:

dotnet ef database update

Verifique a imagem abaixo como deve ficar a solution:

Imagem8

Feito esses comando o Migrations deverá atualizar seu banco de dados com o campo ImageUrl. Agora para funcionar você deverá ter que modificar seu controller e suas views na mão para incluir esse campo novo, ou excluir o controller e incluir novamente, o que neste caso é mais fácil tendo em vista que o Scaffolding ( o scaffolding é um facilitador de desenvolvimento, ele gera estruturas que se repetem várias vezes no sistema de uma maneira rápida e simples) gerou tudo automaticamente.

Isso é um pequeno exemplo, muito simples, mais para ter ideia e começar os estudos.

O código fonte está disponível no meu github como sempre.

Abraços e que 2018 seja um ano incrível para todos, lembrando que comentários construtivos são sempre bem vindos ok?

Marcelo

3 comments

  1. Ótimo artigo amigo. Muito bem explicado e prático. Lendo seu artigo me surgiu uma dúvida. Tem como usar o Sqlite com EFCore 2 em aplicações desktop? Como configurar?

    1. Bartolomeu, obrigado, nao vejo nenhum problema em usar o EF CORE com aplicações desktop (winn forms ou WPF ou UWP) a configuração seria basicamente a mesma do meu exemplo, mas vou criar
      um artigo sobre isso ok? eu particularmente gosto muito de aplicações desktop, mas eu usaria um pouco diferente, minha aplicação desktop iria consumir um serviço WEB API, desta forma
      iria conseguir separa o back-end com serviços e a camada de apresentação com o WPF.

  2. Ótimo artigo. Sua explicação é muito boa e prática.
    Sou novo com ASP.NET core e o Sqlite e tenho uma dúvida que não consegui encontrar a resposta na net, não sei se não soube procurar, mas no caso de fazer essa aplicação funcionar em um servidor o banco de dados sera embutido, eu preciso instalar algo na maquina do cliente, ou basta apenas passar o link que a aplicação irá funcionar normalmente?
    Ps. nunca fiz uma aplicação web funcionar a não ser em localhost e queria saber como fazer pra funcionar em todo lugar rsrsr

Leave a Reply

O seu endereço de e-mail não será publicado.