From dotnet-blazor
Provides Entity Framework Core patterns for DbContext setup, fluent API configurations, migrations, LINQ queries, relationships, CRUD operations, and performance best practices. Useful for .NET data access.
How this skill is triggered — by the user, by Claude, or both
Slash command
/dotnet-blazor:entity-frameworkThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
```csharp
public sealed class AppDbContext(DbContextOptions<AppDbContext> options) : DbContext(options)
{
public DbSet<Product> Products => Set<Product>();
public DbSet<Order> Orders => Set<Order>();
public DbSet<Customer> Customers => Set<Customer>();
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly);
}
}
public sealed class ProductConfiguration : IEntityTypeConfiguration<Product>
{
public void Configure(EntityTypeBuilder<Product> builder)
{
builder.HasKey(p => p.Id);
builder.Property(p => p.Name).HasMaxLength(200).IsRequired();
builder.Property(p => p.Price).HasPrecision(18, 2);
builder.Property(p => p.Sku).HasMaxLength(50);
builder.HasIndex(p => p.Sku).IsUnique();
builder.HasOne(p => p.Category)
.WithMany(c => c.Products)
.HasForeignKey(p => p.CategoryId)
.OnDelete(DeleteBehavior.Restrict);
builder.HasMany(p => p.Tags)
.WithMany(t => t.Products)
.UsingEntity(j => j.ToTable("ProductTags"));
}
}
# Add migration
dotnet ef migrations add InitialCreate --project Data --startup-project Web
# Update database
dotnet ef database update --project Data --startup-project Web
# Generate SQL script
dotnet ef migrations script --idempotent --project Data --startup-project Web
# Remove last migration (if not applied)
dotnet ef migrations remove --project Data --startup-project Web
// Read (always use async, use AsNoTracking for reads)
var products = await db.Products
.AsNoTracking()
.Where(p => p.IsActive)
.OrderBy(p => p.Name)
.ToListAsync(ct);
// Read with projection (best performance)
var dtos = await db.Products
.AsNoTracking()
.Where(p => p.IsActive)
.Select(p => new ProductDto(p.Id, p.Name, p.Price))
.ToListAsync(ct);
// Create
db.Products.Add(new Product { Name = "New", Price = 9.99m });
await db.SaveChangesAsync(ct);
// Update
var product = await db.Products.FindAsync([id], ct);
if (product is not null)
{
product.Price = newPrice;
await db.SaveChangesAsync(ct);
}
// Delete
var product = await db.Products.FindAsync([id], ct);
if (product is not null)
{
db.Products.Remove(product);
await db.SaveChangesAsync(ct);
}
var orders = await db.Orders
.Include(o => o.Customer)
.Include(o => o.Items)
.ThenInclude(i => i.Product)
.AsSplitQuery() // Prevents cartesian explosion
.ToListAsync(ct);
private static readonly Func<AppDbContext, int, CancellationToken, Task<Product?>> GetProductById =
EF.CompileAsyncQuery((AppDbContext db, int id, CancellationToken ct) =>
db.Products.FirstOrDefault(p => p.Id == id));
// Usage
var product = await GetProductById(db, id, ct);
// Bulk update without loading entities
await db.Products
.Where(p => p.CategoryId == oldCategoryId)
.ExecuteUpdateAsync(s => s.SetProperty(p => p.CategoryId, newCategoryId), ct);
// Bulk delete
await db.Products
.Where(p => p.IsDeleted && p.DeletedAt < cutoff)
.ExecuteDeleteAsync(ct);
AsNoTracking() for read-only queriesSelect() projection to only load needed columnsAsSplitQuery() for multiple includesExecuteUpdateAsync/ExecuteDeleteAsync for bulk operationsToList() before Where() (loads entire table)IQueryable in repositories, materialize in servicesnpx claudepluginhub thelobbi/claude --plugin dotnet-blazorEntity Framework Core patterns for .NET 10: DbContext configuration, migrations, interceptors, compiled queries, ExecuteUpdateAsync/ExecuteDeleteAsync, value converters, and query optimization.
Entity Framework Core patterns for ASP.NET Core projects: DbContext design, code-first entity configuration (Fluent API via IEntityTypeConfiguration<T>), relations (HasOne/HasMany, cascade/restrict/set-null), indexes and unique constraints, projection to DTOs (Select + AsNoTracking), avoiding N+1 (Include, AsSplitQuery), transactions, parameterized raw SQL (FromSql with FormattableString), and connection string from IConfiguration. Works alongside aspnet-core-plugin:aspnet-conventions. Use this skill to: - Design a clean DbContext with ApplyConfigurationsFromAssembly for scalable entity registration. - Configure entity properties (column types, max length, precision, nullability) via Fluent API. - Avoid N+1 query problems with explicit Include / projection to DTOs. - Use transactions correctly for multi-entity operations. - Write parameterized raw SQL safely when LINQ is not expressive enough. Do NOT use this skill for: - Migration generation commands (that is efcore-specialist's job in the database extra phase). - ASP.NET Core middleware, DI, or validation — see aspnet-core-plugin:aspnet-conventions. - C# language idioms — see csharp-foundation:csharp-conventions.
Entity Framework Core best practices including NoTracking by default, query splitting for navigation collections, migration management, dedicated migration services, interceptors, compiled queries, and connection resiliency. Use when setting up EF Core in a new project, optimizing query performance, managing database migrations, integrating EF Core with .NET Aspire, or debugging change tracking issues.