O que é Entity Framework Core?
Entity Framework Core (EF Core) é um ORM (Object-Relational Mapper) moderno que permite trabalhar com bancos de dados usando objetos .NET.
Instalação
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
Criando seu DbContext
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
}
Configuração no Program.cs
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
builder.Configuration.GetConnectionString("DefaultConnection")));
Migrations
Migrations permitem versionar o schema do banco de dados:
dotnet ef migrations add InitialCreate
dotnet ef database update
Operações CRUD
Create (Criar)
var product = new Product { Name = "Notebook", Price = 3500 };
_context.Products.Add(product);
await _context.SaveChangesAsync();
Read (Ler)
var products = await _context.Products.ToListAsync();
var product = await _context.Products.FindAsync(id);
var filtered = await _context.Products
.Where(p => p.Price > 1000)
.ToListAsync();
Update (Atualizar)
product.Price = 3200;
_context.Update(product);
await _context.SaveChangesAsync();
Delete (Deletar)
_context.Products.Remove(product);
await _context.SaveChangesAsync();
Relacionamentos
// One-to-Many
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Product> Products { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public int CategoryId { get; set; }
public Category Category { get; set; }
}
Eager Loading vs Lazy Loading
// Eager Loading - Carrega relacionamentos
var products = await _context.Products
.Include(p => p.Category)
.ToListAsync();
// Lazy Loading - Carrega sob demanda (requer configuração)
Performance: AsNoTracking
Use para operações read-only:
var products = await _context.Products
.AsNoTracking()
.ToListAsync();
Boas Práticas
- Use async/await sempre que possível
- Implemente o padrão Repository para desacoplar
- Use AsNoTracking para queries read-only
- Evite consultas N+1 com Include
- Configure índices para colunas frequentemente consultadas