EF Core - Populando dados iniciais (Data Seed) - III


Hoje vamos continuar abordando o recurso disponível a partir da versão 2.1 do EF Core que facilita a alimentação das tabelas criadas com dados iniciais.

Na segunda parte do artigo mostrei como usar o método HasData para alimentar tabelas relacionadas com dados iniciais.

Podemos também adicionar ou alterar dados de inicialização durante migrações subseqüentes. O Entity Framework Core vai comparar os dados no banco de dados e vai gerar os métodos apropriados de inserção, atualização e exclusão.

Vamos continuar usando o projeto do artigo anterior e agora vamos criar uma entidade Pais onde vamos armazenar o nome alguns paises.

Nota: Veja como criar o projeto de exemplo usado neste artigo aqui.

1- Classe Pais

    public class Pais
    {
        public int Id { get; set; }
        public string Nome { get; set; }
    }

A seguir precisamos incluir no arquvo de contexto AppDbContext o DBSet<> para mapear a entidade para a tabela Paises:

public virtual DbSet<Pais> Paises { get; set; }

Para popular a tabela Paises com dados iniciais podemos criar uma classe com um método estático passando o contexto usado e usar o método SaveChanges para incluir os dados.

Vamos criar uma classe DataInitializer e o método SeedPaises() conforme mostrado a seguir:

using System.Collections.Generic;
using System.Linq;
namespace ConsoleEFCore1.Models
{
    public class DataInitializer
    {
        public static void SeedPaises(AppDbContext context)
        {
            if (!context.Paises.Any())
            {
                var paises = new List<Pais>
                {
                    new Pais { Nome = "Albania" },
                    new Pais { Nome = "Angola" },
                    new Pais { Nome = "Argentina" },
                    new Pais { Nome = "Armenia" },
                    new Pais { Nome = "Australia" },
                    new Pais { Nome = "Austria" },
                    new Pais { Nome = "Brasil" },
                    new Pais { Nome = "Canada"},
                };
                context.AddRange(paises);
                context.SaveChanges();
            }
        }
    }
}

A seguir temos que aplicar o Migration para gerar o script de migração:

E aplicar o migration para criar a tabela Paises:

Agora podemos definir o código que vai invocar o método SeedPaises() da classe DataInitializer no método Main();

       static void Main(string[] args)
        {
            using (var _context = new AppDbContext())
            {
                DataInitializer.SeedPaises(_context);

                var paises = _context.Paises.ToList();

                foreach(var pais in paises)
                {
                    Console.WriteLine(pais.Nome);
                }
            }
            Console.ReadLine();
        }

 

Estamos inicializando a tabela com dados e a seguir exibindo o seu conteúdo.  O resultado obtido será:

Na próxima parte do artigo veremos uma forma melhor de aplicar a configuração e alimentar as tabelas.

Pegue o projeto aqui:   ConsoleEFCore1_SeedData3.zip (sem as referências)

"No princípio era o Verbo, e o Verbo estava com Deus, e o Verbo era Deus.
Ele estava no princípio com Deus.
Todas as coisas foram feitas por ele, e sem ele nada do que foi feito se fez."
João 1:1-3

Referências:


José Carlos Macoratti