Este artigo é uma dica rápida, mas extremamente útil! Imagine que você já tem um banco de dados e quer usar o EF, o que você faz ? Cria tudo na mão ? Esera que tem um jeito muito mais interessante!
Apresentando o EF Core PowerTools
Este é uma ferramenta que considero essencial para trabalhar com EF. Não é uma ferramenta nova, já escrevi sobre ela há muitos anos atrás, mas ainda considero bastante útil no cenário que mencionei acima, você já tem o banco e precisa criar as classes. Para começar você então precisa baixar a extensão para o Visual Studio neste link ou se prefeir pode baixar diretamente nas extensões do Visual Studio
Testando o componente
Para este teste vou criar simplesmente um projeto Console em Core, depois clicando com o botão direito na Solution você ver um novo menu:
Agora vamos escolher Reverse Engineer e depois clicamos em Add Database Connection
Lembre-se de escolher a versão do EF Core que você está usando e depois adicione a conexão:
Preencha com os dados do seu servidor:
E depois selecione as tabelas do seu banco:
Por último podemos ajustar algumas configurações da geração do código:
Se você quer dar uma “refinada” nas classes, por exemplo gerando arquivos de configuração, vá em Advanced:
Agora sim, ja temos nossas classes, vejam o projeto:
Agora vamos examinar algumas classes:
Contexto
public partial class EF1Context : DbContext
{
public EF1Context(DbContextOptions<EF1Context> options)
: base(options)
{
}
public virtual DbSet<Cliente> Cliente { get; set; } = null!;
public virtual DbSet<Pedido> Pedido { get; set; } = null!;
public virtual DbSet<PedidoItem> PedidoItem { get; set; } = null!;
public virtual DbSet<Produto> Produto { get; set; } = null!;
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new Configurations.ClienteConfiguration());
modelBuilder.ApplyConfiguration(new Configurations.PedidoConfiguration());
modelBuilder.ApplyConfiguration(new Configurations.PedidoItemConfiguration());
modelBuilder.ApplyConfiguration(new Configurations.ProdutoConfiguration());
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
Cliente
public partial class Cliente
{
public Cliente()
{
Pedido = new HashSet<Pedido>();
}
public int Id { get; set; }
public string Nome { get; set; } = null!;
public virtual ICollection<Pedido> Pedido { get; set; }
}
Pedido
public partial class Pedido
{
public Pedido()
{
PedidoItem = new HashSet<PedidoItem>();
}
public int Id { get; set; }
public DateTime Data { get; set; }
public int ClienteId { get; set; }
public decimal Total { get; set; }
public virtual Cliente Cliente { get; set; } = null!;
public virtual ICollection<PedidoItem> PedidoItem { get; set; }
}
Vejam que os relacionamentos foram feitos!
PedidoConfiguration
public partial class PedidoConfiguration : IEntityTypeConfiguration<Pedido>
{
public void Configure(EntityTypeBuilder<Pedido> entity)
{
entity.HasIndex(e => e.ClienteId, "IX_Pedido_ClienteId");
entity.Property(e => e.Total).HasColumnType("decimal(18, 2)");
entity.HasOne(d => d.Cliente)
.WithMany(p => p.Pedido)
.HasForeignKey(d => d.ClienteId)
.OnDelete(DeleteBehavior.ClientSetNull);
OnConfigurePartial(entity);
}
partial void OnConfigurePartial(EntityTypeBuilder<Pedido> entity);
}
Agora só instanciar o contexto e testar:
static void Main(string[] args)
{
var opt = new DbContextOptionsBuilder<EF1Context>()
.UseSqlServer("data source=(local); initial catalog=EF1;integrated security=true;trusted_connection=true; encrypt=false;");
var db = new EF1Context(opt.Options);
foreach(var c in db.Cliente)
{
Console.WriteLine($"{c.Nome}");
}
}
O código fonte deste exemplo pode ser encontrado no meu GitHub: https://github.com/carloscds/EntityFramework
Abraços e até a próxima!