Swevo.EFCore.Seeding
1.0.1
Prefix Reserved
dotnet add package Swevo.EFCore.Seeding --version 1.0.1
NuGet\Install-Package Swevo.EFCore.Seeding -Version 1.0.1
<PackageReference Include="Swevo.EFCore.Seeding" Version="1.0.1" />
<PackageVersion Include="Swevo.EFCore.Seeding" Version="1.0.1" />
<PackageReference Include="Swevo.EFCore.Seeding" />
paket add Swevo.EFCore.Seeding --version 1.0.1
#r "nuget: Swevo.EFCore.Seeding, 1.0.1"
#:package Swevo.EFCore.Seeding@1.0.1
#addin nuget:?package=Swevo.EFCore.Seeding&version=1.0.1
#tool nuget:?package=Swevo.EFCore.Seeding&version=1.0.1
Swevo.EFCore.Seeding
Fluent, idempotent, dependency-ordered seed data for EF Core. Define IEntitySeed<T> classes, declare run-order dependencies, then call SeedDatabaseAsync() on startup. Seeds that find existing data skip themselves automatically.
// 1. Define seeds
public class RolesSeed : IEntitySeed<Role>
{
public IEnumerable<Role> GetData() =>
[
new Role { Id = 1, Name = "Admin" },
new Role { Id = 2, Name = "User" },
];
}
public class UsersSeed : IEntitySeed<User>
{
public IEnumerable<User> GetData() =>
[
new User { Id = 1, Email = "admin@example.com", RoleId = 1 },
];
}
// 2. Register
builder.Services.AddEFCoreSeeding<AppDbContext>(seeds =>
{
seeds.Add<RolesSeed, Role>();
seeds.Add<UsersSeed, User>().DependsOn<RolesSeed>(); // roles run first
});
// 3. Apply once the host is built
await app.SeedDatabaseAsync();
Install
dotnet add package Swevo.EFCore.Seeding
How idempotency works
Before inserting, the runner calls DbSet<T>.AnyAsync(). If the set already contains rows the entire seed is skipped. This means:
- Safe to call
SeedDatabaseAsync()on every startup - Re-deploying never duplicates reference data
- Production and test environments stay in sync
Dependency ordering
Declare which seeds must complete before another starts using .DependsOn<TSeed>():
seeds.Add<PermissionsSeed, Permission>();
seeds.Add<RolesSeed, Role>();
seeds.Add<UserRoleSeed, UserRole>()
.DependsOn<PermissionsSeed>()
.DependsOn<RolesSeed>();
The runner performs a topological sort (Kahn's algorithm) and executes seeds in a valid order. Circular dependencies throw InvalidOperationException at startup, not at runtime.
Unregistered dependency detection
seeds.Add<UsersSeed, User>().DependsOn<RolesSeed>(); // RolesSeed not registered → throws
InvalidOperationException: Seed 'UsersSeed' declares a dependency on 'RolesSeed',
but 'RolesSeed' is not registered. Call .Add<RolesSeed, Role>() first.
Manual trigger
If you prefer to seed on demand rather than at startup:
using var scope = app.Services.CreateScope();
var runner = scope.ServiceProvider.GetRequiredService<ISeedRunner>();
await runner.RunAsync();
Testing
The runner is registered as ISeedRunner — mock or stub it in unit tests:
// In integration tests with EF Core InMemory:
builder.Services.AddEFCoreSeeding<TestDbContext>(seeds =>
seeds.Add<RolesSeed, Role>());
await host.SeedDatabaseAsync();
// db.Roles is now populated
Part of the Swevo EF Core toolkit
| Package | Purpose |
|---|---|
| Swevo.EFCore.Seeding | This package |
| Swevo.EFCore.StronglyTyped | Strongly-typed IDs |
| Swevo.AutoAudit | Audit fields |
| Swevo.EFCore.SoftDelete | Soft delete + global query filter |
| Swevo.EFCore.Outbox | Transactional outbox |
| Swevo.EFCore.Pagination | Offset + cursor pagination |
License
MIT © 2026 Justin Bannister
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- Microsoft.EntityFrameworkCore (>= 8.0.28)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.2)
- Microsoft.Extensions.Hosting.Abstractions (>= 8.0.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
1.0.0: IEntitySeed<T>, fluent DependsOn dependency ordering, topological sort, AnyAsync idempotency, IHost.SeedDatabaseAsync().