Popular tabelas usando Code First entity framework core (Seed Data)
Olá Devs,
Hoje vamos falar sobre o Seed Data ou como popular uma tabela no banco de dados usando o Entity Framework (EF) Core Migrations.
Em um dia de correria, uma pessoa me perguntou como ele faria para popular as tabelas no banco de dados usando o Entity Framework (EF) no modelo Code First, ou seja, que codifico primeiro e depois crio meu banco de dados automaticamente usando o Entity Framework (EF) Core Migrations. Ele precisava popular ou fazer os inserts em tabelas auxiliares. Ai eu disse a ele: “Isso é Seed Data!!!”. Recebi um sonoro “Heinn??!!”. 😀
A bagaça é simples.
Para comunicação com o banco de dados no EF usamos o DbContext.
public class EstoqueContext: DbContext { public EstoqueContext(DbContextOptions<EstoqueContext> options) : base(options) { } public DbSet<Produto> Produtos { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.ApplyConfiguration(new ProdutoMap()); } }
Devemos fazer a sobrecarga do método OnModelCreating. Nesse método que informamos os mapeamentos que queremos fazer do projeto com o banco de dados. Nesse caso estou mapeando a Classe Produto com sua respectiva tabela. Uso o Fluent API. Veja a classe abaixo.
public class ProdutoMap : IEntityTypeConfiguration<Produto> { public void Configure(EntityTypeBuilder<Produto> builder) { builder.ToTable("produtos"); builder.HasKey(x => x.Id); builder.Property(x => x.Id).HasColumnName("id"); builder.Property(x => x.Nome).HasColumnName("nome").IsRequired().HasMaxLength(100); builder.Property(x => x.QuantidadeEstoque).HasColumnName("quantidadeEstoque").IsRequired(); builder.Property(x => x.Valor).HasColumnName("valor").HasColumnType("decimal(15,2)").IsRequired(); builder.Ignore(x => x.Erros); builder.HasData(PopularProdutos()); } private IList<Produto> PopularProdutos() { return new List<Produto> { new Produto(1, "BMW X1", 100, 200000M), new Produto(2, "BMW 320", 100, 250000M), new Produto(3, "MERCEDES A200", 100, 290000M), new Produto(4, "LAND EVOQUE", 100, 350000M), new Produto(5, "FERRARI F40", 100, 1250000M) }; } }
Aqui informo o mapeamento, mas o que importa está na chamada builder.HasData(PopularProdutos()). Esse método espera uma lista dos seus produtos ou dos seus dados que precisar. Assim quando rodar o seu migrations ele vai preencher a tabela com esses dados.
Uma outra forma de fazer
Vamos imaginar que já tem tudo feito com DataAnnotation ou qualquer outra forma de mapeamento. Basta na sobrecarga vista acima OnModelCreating mapear os dados.
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Produto>().HasData(new List<Produto> { new Produto(1, "BMW X1", 100, 200000M), new Produto(2, "BMW 320", 100, 250000M), new Produto(3, "MERCEDES A200", 100, 290000M), new Produto(4, "LAND EVOQUE", 100, 350000M), new Produto(5, "FERRARI F40", 100, 1250000M) }); }
Mel na chupeta!
No meu GitHub tem os fontes de um projeto com esses exemplos.
Procure o EstoqueContext nesse repositório que verá o exemplo.
#fiqueemcasa e tamo junto!
Deixe uma resposta
Want to join the discussion?Feel free to contribute!