@polymorphism-tech/morph-spec 4.6.0 → 4.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +414 -700
- package/docs/ARCHITECTURE.md +331 -0
- package/docs/CHEATSHEET.md +221 -0
- package/docs/COMMAND-FLOWS.md +368 -0
- package/docs/QUICKSTART.md +212 -0
- package/docs/examples/order-management/contracts.cs +84 -0
- package/docs/examples/order-management/proposal.md +24 -0
- package/docs/examples/order-management/spec.md +162 -0
- package/docs/plans/2026-02-23-ddd-architecture-refactor.md +1153 -0
- package/docs/plans/2026-02-23-ddd-nextsteps.md +682 -0
- package/docs/plans/2026-02-23-infra-architect-refactor.md +437 -0
- package/docs/plans/2026-02-23-nextjs-code-review-design.md +156 -0
- package/docs/plans/2026-02-23-nextjs-code-review-impl.md +1254 -0
- package/docs/plans/2026-02-23-nextjs-standards-design.md +149 -0
- package/docs/plans/2026-02-23-nextjs-standards-impl.md +1846 -0
- package/framework/agents/README.md +14 -14
- package/framework/agents/architecture/standards-architect.md +159 -159
- package/framework/agents/frontend/nextjs-expert.md +87 -127
- package/framework/agents/infrastructure/azure-architect.md +147 -147
- package/framework/agents/infrastructure/infra-architect.md +45 -0
- package/framework/agents.json +1145 -278
- package/framework/rules/frontend-standards.md +0 -3
- package/framework/rules/nextjs-standards.md +17 -0
- package/framework/skills/level-0-meta/code-review-nextjs/SKILL.md +147 -0
- package/framework/skills/level-0-meta/code-review-nextjs/references/review-example-nextjs.md +254 -0
- package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +3 -3
- package/framework/skills/level-1-workflows/phase-design/SKILL.md +45 -9
- package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +38 -0
- package/framework/standards/STANDARDS.json +121 -0
- package/framework/standards/architecture/ddd/bounded-contexts.md +105 -0
- package/framework/standards/architecture/ddd/complexity-levels.md +108 -0
- package/framework/standards/architecture/ddd/ubiquitous-language.md +58 -0
- package/framework/standards/frontend/nextjs/app-router.md +123 -0
- package/framework/standards/frontend/nextjs/components.md +132 -0
- package/framework/standards/frontend/nextjs/data-fetching.md +126 -0
- package/framework/standards/frontend/nextjs/forms.md +128 -0
- package/framework/standards/frontend/nextjs/naming-conventions.md +67 -0
- package/framework/standards/frontend/nextjs/project-structure.md +102 -0
- package/framework/standards/frontend/nextjs/state-management.md +72 -0
- package/framework/standards/frontend/nextjs/testing.md +111 -0
- package/framework/templates/REGISTRY.json +538 -142
- package/framework/templates/code/dotnet/contracts/contracts-level1.cs +69 -0
- package/framework/templates/code/dotnet/contracts/contracts-level2.cs +86 -0
- package/framework/templates/code/dotnet/contracts/contracts-level3.cs +41 -0
- package/framework/templates/docs/spec.md +49 -0
- package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -0
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -0
- package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -0
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -0
- package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -0
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -0
- package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -0
- package/framework/templates/project-structure/dotnet-ddd.md +70 -0
- package/framework/workflows/docs/enforcement-pipeline.md +2 -1
- package/package.json +1 -1
- package/scripts/scan-nextjs.mjs +169 -0
- package/src/commands/project/doctor.js +52 -1
- package/src/commands/project/init.js +15 -1
- package/src/commands/project/update.js +6 -1
- package/src/lib/standards/standards-context-injector.js +5 -0
- package/src/lib/validators/nextjs/index.js +6 -0
- package/src/lib/validators/nextjs/next-component-validator.js +181 -0
- package/src/lib/validators/validation-runner.js +5 -0
- package/src/utils/agents-installer.js +14 -2
- package/.morph/.morphversion +0 -5
- package/.morph/analytics/threads-log.jsonl +0 -6
- package/.morph/config/config.json +0 -8
- package/.morph/framework/agents.json +0 -948
- package/.morph/framework/standards/STANDARDS.json +0 -812
- package/.morph/framework/standards/ai-agents/blazor-ui.md +0 -364
- package/.morph/framework/standards/ai-agents/production.md +0 -415
- package/.morph/framework/standards/ai-agents/setup.md +0 -418
- package/.morph/framework/standards/ai-agents/team-orchestration.md +0 -479
- package/.morph/framework/standards/ai-agents/workflows.md +0 -354
- package/.morph/framework/standards/architecture/ddd/aggregates.md +0 -120
- package/.morph/framework/standards/architecture/ddd/entities.md +0 -99
- package/.morph/framework/standards/architecture/ddd/value-objects.md +0 -124
- package/.morph/framework/standards/backend/api/minimal-api.md +0 -494
- package/.morph/framework/standards/backend/api/rest.md +0 -492
- package/.morph/framework/standards/backend/api/validation.md +0 -88
- package/.morph/framework/standards/backend/authentication/passkeys.md +0 -428
- package/.morph/framework/standards/backend/database/ef-core.md +0 -199
- package/.morph/framework/standards/backend/database/migrations.md +0 -393
- package/.morph/framework/standards/backend/database/postgresql/database.md +0 -352
- package/.morph/framework/standards/backend/database/repository-patterns.md +0 -528
- package/.morph/framework/standards/backend/database/vector-search-rag.md +0 -541
- package/.morph/framework/standards/backend/dotnet/async.md +0 -366
- package/.morph/framework/standards/backend/dotnet/core.md +0 -117
- package/.morph/framework/standards/backend/dotnet/di.md +0 -439
- package/.morph/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
- package/.morph/framework/standards/backend/integrations/asaas/asaas-api.md +0 -216
- package/.morph/framework/standards/backend/integrations/clerk/clerk-auth.md +0 -290
- package/.morph/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
- package/.morph/framework/standards/backend/integrations/resend/resend-email.md +0 -385
- package/.morph/framework/standards/context/analytics.md +0 -96
- package/.morph/framework/standards/context/bundles.md +0 -110
- package/.morph/framework/standards/context/priming.md +0 -78
- package/.morph/framework/standards/core/architecture.md +0 -185
- package/.morph/framework/standards/core/coding.md +0 -214
- package/.morph/framework/standards/core/git-branching-strategy.md +0 -403
- package/.morph/framework/standards/core/git.md +0 -185
- package/.morph/framework/standards/core/testing.md +0 -295
- package/.morph/framework/standards/data/nosql/blob-storage.md +0 -102
- package/.morph/framework/standards/data/nosql/cache/redis.md +0 -97
- package/.morph/framework/standards/data/nosql/cosmos-db.md +0 -118
- package/.morph/framework/standards/data/vector-search/azure-ai-search.md +0 -121
- package/.morph/framework/standards/data/vector-search/rag-chunking.md +0 -104
- package/.morph/framework/standards/frontend/blazor/design-checklist.md +0 -222
- package/.morph/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
- package/.morph/framework/standards/frontend/blazor/fluent-ui.md +0 -137
- package/.morph/framework/standards/frontend/blazor/html-conversion.md +0 -184
- package/.morph/framework/standards/frontend/blazor/lifecycle.md +0 -195
- package/.morph/framework/standards/frontend/blazor/pitfalls.md +0 -198
- package/.morph/framework/standards/frontend/blazor/state.md +0 -191
- package/.morph/framework/standards/frontend/design-system/animations.md +0 -151
- package/.morph/framework/standards/frontend/design-system/naming.md +0 -64
- package/.morph/framework/standards/frontend/nextjs/nextjs-patterns.md +0 -215
- package/.morph/framework/standards/infrastructure/azure/azure.md +0 -624
- package/.morph/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
- package/.morph/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
- package/.morph/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
- package/.morph/framework/standards/infrastructure/azure/services/functions.md +0 -486
- package/.morph/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
- package/.morph/framework/standards/infrastructure/azure/services/storage.md +0 -407
- package/.morph/framework/standards/infrastructure/docker/easypanel-deploy.md +0 -196
- package/.morph/framework/standards/infrastructure/supabase/mcp-setup.md +0 -252
- package/.morph/framework/standards/infrastructure/supabase/supabase-auth.md +0 -176
- package/.morph/framework/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
- package/.morph/framework/standards/infrastructure/supabase/supabase-rls.md +0 -184
- package/.morph/framework/standards/infrastructure/supabase/supabase-storage.md +0 -153
- package/.morph/framework/standards/integration/api/graphql.md +0 -91
- package/.morph/framework/standards/integration/api/grpc.md +0 -114
- package/.morph/framework/standards/integration/api/rest-design.md +0 -95
- package/.morph/framework/standards/integration/event-driven/cqrs.md +0 -101
- package/.morph/framework/standards/integration/event-driven/event-sourcing.md +0 -124
- package/.morph/framework/standards/integration/event-driven/service-bus.md +0 -95
- package/.morph/framework/standards/integration/mcp/mcp-tools.md +0 -384
- package/.morph/framework/standards/observability/logging.md +0 -131
- package/.morph/framework/standards/observability/metrics.md +0 -121
- package/.morph/framework/standards/observability/monitoring.md +0 -114
- package/.morph/framework/standards/observability/tracing.md +0 -132
- package/.morph/framework/standards/workflows/parallel-execution.md +0 -112
- package/.morph/framework/standards/workflows/thread-management.md +0 -113
- package/.morph/framework/templates/.idea/morph-templates.xml +0 -92
- package/.morph/framework/templates/.vscode/morph-templates.code-snippets +0 -186
- package/.morph/framework/templates/IDE-SNIPPETS.md +0 -266
- package/.morph/framework/templates/README.md +0 -814
- package/.morph/framework/templates/REGISTRY.json +0 -1492
- package/.morph/framework/templates/code/dotnet/backend/repository.cs +0 -141
- package/.morph/framework/templates/code/dotnet/backend/service.cs +0 -139
- package/.morph/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
- package/.morph/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/README.md +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
- package/.morph/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
- package/.morph/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
- package/.morph/framework/templates/code/dotnet/database/migration.cs +0 -83
- package/.morph/framework/templates/code/dotnet/frontend/component.razor +0 -239
- package/.morph/framework/templates/code/dotnet/jobs/agent.cs +0 -163
- package/.morph/framework/templates/code/dotnet/jobs/job.cs +0 -171
- package/.morph/framework/templates/code/dotnet/test.cs +0 -239
- package/.morph/framework/templates/code/sql/rls-policy.sql +0 -57
- package/.morph/framework/templates/code/sql/supabase-migration.sql +0 -100
- package/.morph/framework/templates/code/sql/supabase-migration.template.sql +0 -113
- package/.morph/framework/templates/code/typescript/contracts.ts +0 -168
- package/.morph/framework/templates/context/CONTEXT-FEATURE.md +0 -276
- package/.morph/framework/templates/context/CONTEXT.md +0 -181
- package/.morph/framework/templates/docs/clarifications.md +0 -253
- package/.morph/framework/templates/docs/onboarding.md +0 -123
- package/.morph/framework/templates/docs/proposal.md +0 -182
- package/.morph/framework/templates/docs/schema-analysis.md +0 -119
- package/.morph/framework/templates/docs/spec.md +0 -149
- package/.morph/framework/templates/docs/ui-components.md +0 -124
- package/.morph/framework/templates/docs/ui-design-system.md +0 -76
- package/.morph/framework/templates/docs/ui-flows.md +0 -167
- package/.morph/framework/templates/docs/ui-mockups.md +0 -98
- package/.morph/framework/templates/docs/user-stories.md +0 -34
- package/.morph/framework/templates/examples/design-system-examples.md +0 -357
- package/.morph/framework/templates/examples/spec-examples.md +0 -90
- package/.morph/framework/templates/feature/decisions.md +0 -187
- package/.morph/framework/templates/feature/recap.md +0 -146
- package/.morph/framework/templates/feature/tasks.md +0 -199
- package/.morph/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
- package/.morph/framework/templates/infrastructure/azure/README.md +0 -286
- package/.morph/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
- package/.morph/framework/templates/infrastructure/azure/app-service.bicep +0 -164
- package/.morph/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
- package/.morph/framework/templates/infrastructure/azure/container-app.bicep +0 -156
- package/.morph/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
- package/.morph/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
- package/.morph/framework/templates/infrastructure/azure/deploy.sh +0 -208
- package/.morph/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
- package/.morph/framework/templates/infrastructure/azure/main.bicep +0 -189
- package/.morph/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
- package/.morph/framework/templates/infrastructure/azure/storage.bicep +0 -106
- package/.morph/framework/templates/infrastructure/docker/Dockerfile.template +0 -58
- package/.morph/framework/templates/infrastructure/docker/docker-compose.template.yml +0 -67
- package/.morph/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +0 -38
- package/.morph/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +0 -48
- package/.morph/framework/templates/infrastructure/docker/easypanel.template.json +0 -54
- package/.morph/framework/templates/infrastructure/github/README.md +0 -593
- package/.morph/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
- package/.morph/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -45
- package/.morph/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +0 -27
- package/.morph/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
- package/.morph/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -31
- package/.morph/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -59
- package/.morph/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -39
- package/.morph/framework/templates/integrations/asaas-client.cs +0 -387
- package/.morph/framework/templates/integrations/asaas-webhook.cs +0 -351
- package/.morph/framework/templates/integrations/azure-identity-config.cs +0 -288
- package/.morph/framework/templates/integrations/clerk-config.cs +0 -258
- package/.morph/framework/templates/meta-prompts/fusion/fusion-agent.md +0 -76
- package/.morph/framework/templates/meta-prompts/fusion/fusion-aggregator.md +0 -100
- package/.morph/framework/templates/meta-prompts/hops/hop-retry.md +0 -78
- package/.morph/framework/templates/meta-prompts/hops/hop-validation.md +0 -97
- package/.morph/framework/templates/meta-prompts/hops/hop-wrapper.md +0 -36
- package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +0 -113
- package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +0 -80
- package/.morph/framework/templates/meta-prompts/squad-leaders/backend-squad.md +0 -90
- package/.morph/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +0 -126
- package/.morph/framework/templates/meta-prompts/squad-leaders/squad-leader.md +0 -43
- package/.morph/framework/templates/meta-prompts/validators/checkpoint-validator.md +0 -107
- package/.morph/framework/templates/meta-prompts/validators/pre-commit-validator.md +0 -95
- package/.morph/framework/templates/saas/subscription.cs +0 -347
- package/.morph/framework/templates/saas/tenant.cs +0 -338
- package/.morph/framework/templates/state.template.json +0 -17
- package/.morph/framework/templates/ui/FluentDesignTheme.cs +0 -149
- package/.morph/framework/templates/ui/MudTheme.cs +0 -281
- package/.morph/framework/templates/ui/design-system.css +0 -226
- package/.morph/logs/tool-failures.log +0 -7
- package/.morph/memory/pre-compact-2026-02-23T15-43-03-521Z.json +0 -16
- package/.morph/state.json +0 -48
- package/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
- package/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
|
@@ -1,393 +0,0 @@
|
|
|
1
|
-
# EF Core Migrations Standards
|
|
2
|
-
|
|
3
|
-
> **Scope:** blazor-azure,nextjs-supabase
|
|
4
|
-
> **Layer:** 1 (on domain)
|
|
5
|
-
> **Keywords:** migration, schema, database update, ef migrations
|
|
6
|
-
> **Load When:** database work
|
|
7
|
-
|
|
8
|
-
Migration naming, creation, and deployment best practices
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Migration Naming
|
|
13
|
-
|
|
14
|
-
### Format
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
{Timestamp}_{DescriptiveAction}
|
|
18
|
-
|
|
19
|
-
Examples:
|
|
20
|
-
20260216103000_CreateUserTable
|
|
21
|
-
20260216104500_AddEmailIndexToUsers
|
|
22
|
-
20260216110000_AlterOrdersAddTotalColumn
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
### Naming Convention
|
|
26
|
-
|
|
27
|
-
- Use PascalCase
|
|
28
|
-
- Start with action verb: `Create`, `Add`, `Alter`, `Remove`, `Update`
|
|
29
|
-
- Be specific about what changed
|
|
30
|
-
- Keep under 50 characters
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
# ✅ GOOD
|
|
34
|
-
dotnet ef migrations add CreateUserTable
|
|
35
|
-
dotnet ef migrations add AddEmailIndexToUsers
|
|
36
|
-
dotnet ef migrations add AlterOrdersAddStatusColumn
|
|
37
|
-
|
|
38
|
-
# ❌ BAD
|
|
39
|
-
dotnet ef migrations add Update
|
|
40
|
-
dotnet ef migrations add Changes
|
|
41
|
-
dotnet ef migrations add Fix
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## Creating Migrations
|
|
47
|
-
|
|
48
|
-
### Command
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
# Create migration
|
|
52
|
-
dotnet ef migrations add CreateUserTable --project Infrastructure --startup-project Web
|
|
53
|
-
|
|
54
|
-
# Create migration with output folder
|
|
55
|
-
dotnet ef migrations add AddOrderEntity --output-dir Data/Migrations
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Before Creating Migration
|
|
59
|
-
|
|
60
|
-
1. **Build project** - Ensure no compilation errors
|
|
61
|
-
2. **Review model changes** - Verify entity changes are correct
|
|
62
|
-
3. **Check DbContext** - Ensure DbSet and OnModelCreating are updated
|
|
63
|
-
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
## Migration Content
|
|
67
|
-
|
|
68
|
-
### Up Method (Apply Changes)
|
|
69
|
-
|
|
70
|
-
```csharp
|
|
71
|
-
protected override void Up(MigrationBuilder migrationBuilder)
|
|
72
|
-
{
|
|
73
|
-
// Create table
|
|
74
|
-
migrationBuilder.CreateTable(
|
|
75
|
-
name: "Users",
|
|
76
|
-
columns: table => new
|
|
77
|
-
{
|
|
78
|
-
Id = table.Column<int>(nullable: false)
|
|
79
|
-
.Annotation("SqlServer:Identity", "1, 1"),
|
|
80
|
-
Email = table.Column<string>(maxLength: 256, nullable: false),
|
|
81
|
-
PasswordHash = table.Column<string>(nullable: false),
|
|
82
|
-
CreatedAt = table.Column<DateTime>(nullable: false, defaultValueSql: "GETUTCDATE()")
|
|
83
|
-
},
|
|
84
|
-
constraints: table =>
|
|
85
|
-
{
|
|
86
|
-
table.PrimaryKey("PK_Users", x => x.Id);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
// Create index
|
|
90
|
-
migrationBuilder.CreateIndex(
|
|
91
|
-
name: "IX_Users_Email",
|
|
92
|
-
table: "Users",
|
|
93
|
-
column: "Email",
|
|
94
|
-
unique: true);
|
|
95
|
-
}
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### Down Method (Rollback Changes)
|
|
99
|
-
|
|
100
|
-
```csharp
|
|
101
|
-
protected override void Down(MigrationBuilder migrationBuilder)
|
|
102
|
-
{
|
|
103
|
-
// Drop in reverse order
|
|
104
|
-
migrationBuilder.DropIndex(
|
|
105
|
-
name: "IX_Users_Email",
|
|
106
|
-
table: "Users");
|
|
107
|
-
|
|
108
|
-
migrationBuilder.DropTable(
|
|
109
|
-
name: "Users");
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
## Data Seeding in Migrations
|
|
116
|
-
|
|
117
|
-
### Seed Required Data
|
|
118
|
-
|
|
119
|
-
```csharp
|
|
120
|
-
protected override void Up(MigrationBuilder migrationBuilder)
|
|
121
|
-
{
|
|
122
|
-
// Create table
|
|
123
|
-
migrationBuilder.CreateTable(...);
|
|
124
|
-
|
|
125
|
-
// Seed data
|
|
126
|
-
migrationBuilder.InsertData(
|
|
127
|
-
table: "Roles",
|
|
128
|
-
columns: new[] { "Id", "Name" },
|
|
129
|
-
values: new object[,]
|
|
130
|
-
{
|
|
131
|
-
{ 1, "Admin" },
|
|
132
|
-
{ 2, "User" }
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
protected override void Down(MigrationBuilder migrationBuilder)
|
|
137
|
-
{
|
|
138
|
-
// Delete data
|
|
139
|
-
migrationBuilder.DeleteData(
|
|
140
|
-
table: "Roles",
|
|
141
|
-
keyColumn: "Id",
|
|
142
|
-
keyValues: new object[] { 1, 2 });
|
|
143
|
-
|
|
144
|
-
migrationBuilder.DropTable("Roles");
|
|
145
|
-
}
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
---
|
|
149
|
-
|
|
150
|
-
## Applying Migrations
|
|
151
|
-
|
|
152
|
-
### Development
|
|
153
|
-
|
|
154
|
-
```bash
|
|
155
|
-
# Apply all pending migrations
|
|
156
|
-
dotnet ef database update
|
|
157
|
-
|
|
158
|
-
# Apply to specific migration
|
|
159
|
-
dotnet ef database update CreateUserTable
|
|
160
|
-
|
|
161
|
-
# Rollback to previous migration
|
|
162
|
-
dotnet ef database update PreviousMigrationName
|
|
163
|
-
|
|
164
|
-
# Rollback all migrations
|
|
165
|
-
dotnet ef database update 0
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
### Production
|
|
169
|
-
|
|
170
|
-
**Option 1: SQL Script (Recommended)**
|
|
171
|
-
|
|
172
|
-
```bash
|
|
173
|
-
# Generate SQL script for all pending migrations
|
|
174
|
-
dotnet ef migrations script --output migrate.sql
|
|
175
|
-
|
|
176
|
-
# Generate SQL from specific range
|
|
177
|
-
dotnet ef migrations script FromMigration ToMigration --output migrate.sql
|
|
178
|
-
|
|
179
|
-
# Idempotent script (can run multiple times)
|
|
180
|
-
dotnet ef migrations script --idempotent --output migrate.sql
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
**Option 2: Automatic (Startup)**
|
|
184
|
-
|
|
185
|
-
```csharp
|
|
186
|
-
// Program.cs
|
|
187
|
-
using (var scope = app.Services.CreateScope())
|
|
188
|
-
{
|
|
189
|
-
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
|
|
190
|
-
|
|
191
|
-
if (builder.Environment.IsDevelopment())
|
|
192
|
-
{
|
|
193
|
-
await context.Database.MigrateAsync(); // ✅ Dev only
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
---
|
|
199
|
-
|
|
200
|
-
## Handling Production Data
|
|
201
|
-
|
|
202
|
-
### Adding Column with Default
|
|
203
|
-
|
|
204
|
-
```csharp
|
|
205
|
-
protected override void Up(MigrationBuilder migrationBuilder)
|
|
206
|
-
{
|
|
207
|
-
// Add column with default value (safe for existing rows)
|
|
208
|
-
migrationBuilder.AddColumn<string>(
|
|
209
|
-
name: "Status",
|
|
210
|
-
table: "Orders",
|
|
211
|
-
nullable: false,
|
|
212
|
-
defaultValue: "Pending"); // ✅ Default prevents NULL for existing rows
|
|
213
|
-
}
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
### Renaming Column (Preserve Data)
|
|
217
|
-
|
|
218
|
-
```csharp
|
|
219
|
-
protected override void Up(MigrationBuilder migrationBuilder)
|
|
220
|
-
{
|
|
221
|
-
// Rename column (data preserved)
|
|
222
|
-
migrationBuilder.RenameColumn(
|
|
223
|
-
name: "OldName",
|
|
224
|
-
table: "Users",
|
|
225
|
-
newName: "NewName");
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
protected override void Down(MigrationBuilder migrationBuilder)
|
|
229
|
-
{
|
|
230
|
-
migrationBuilder.RenameColumn(
|
|
231
|
-
name: "NewName",
|
|
232
|
-
table: "Users",
|
|
233
|
-
newName: "OldName");
|
|
234
|
-
}
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### Altering Column Type (Risky)
|
|
238
|
-
|
|
239
|
-
```csharp
|
|
240
|
-
protected override void Up(MigrationBuilder migrationBuilder)
|
|
241
|
-
{
|
|
242
|
-
// ⚠️ RISKY: May lose data if not compatible
|
|
243
|
-
// Example: VARCHAR(50) → VARCHAR(100) is safe
|
|
244
|
-
// VARCHAR(100) → VARCHAR(50) may truncate
|
|
245
|
-
// NVARCHAR → INT will fail
|
|
246
|
-
|
|
247
|
-
migrationBuilder.AlterColumn<string>(
|
|
248
|
-
name: "Email",
|
|
249
|
-
table: "Users",
|
|
250
|
-
maxLength: 512, // Increased from 256
|
|
251
|
-
nullable: false,
|
|
252
|
-
oldClrType: typeof(string),
|
|
253
|
-
oldMaxLength: 256);
|
|
254
|
-
}
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
---
|
|
258
|
-
|
|
259
|
-
## Best Practices
|
|
260
|
-
|
|
261
|
-
### DO
|
|
262
|
-
|
|
263
|
-
✅ **Review generated migration before applying**
|
|
264
|
-
|
|
265
|
-
```bash
|
|
266
|
-
dotnet ef migrations add AddUserEntity
|
|
267
|
-
# Review Migrations/xxxxx_AddUserEntity.cs file
|
|
268
|
-
# Verify Up and Down methods are correct
|
|
269
|
-
dotnet ef database update
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
✅ **Create migrations for each logical change**
|
|
273
|
-
|
|
274
|
-
```bash
|
|
275
|
-
# ✅ GOOD (separate migrations)
|
|
276
|
-
dotnet ef migrations add CreateUserTable
|
|
277
|
-
dotnet ef migrations add CreateOrderTable
|
|
278
|
-
|
|
279
|
-
# ❌ BAD (one big migration)
|
|
280
|
-
dotnet ef migrations add CreateAllTables
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
✅ **Test migrations in dev before production**
|
|
284
|
-
|
|
285
|
-
```bash
|
|
286
|
-
# Test migration
|
|
287
|
-
dotnet ef database update
|
|
288
|
-
|
|
289
|
-
# Test rollback
|
|
290
|
-
dotnet ef database update PreviousMigration
|
|
291
|
-
|
|
292
|
-
# Test re-apply
|
|
293
|
-
dotnet ef database update LatestMigration
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
✅ **Use idempotent scripts for production**
|
|
297
|
-
|
|
298
|
-
```bash
|
|
299
|
-
dotnet ef migrations script --idempotent --output deploy.sql
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
### DON'T
|
|
303
|
-
|
|
304
|
-
❌ **Don't modify applied migrations**
|
|
305
|
-
|
|
306
|
-
```csharp
|
|
307
|
-
// ❌ WRONG (migration already applied in prod)
|
|
308
|
-
protected override void Up(MigrationBuilder migrationBuilder)
|
|
309
|
-
{
|
|
310
|
-
// Changed this after already deployed - will cause issues!
|
|
311
|
-
migrationBuilder.CreateTable(...);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
// ✅ CORRECT (create new migration)
|
|
315
|
-
dotnet ef migrations add FixUserTable
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
❌ **Don't delete migrations already in production**
|
|
319
|
-
|
|
320
|
-
```bash
|
|
321
|
-
# ❌ WRONG (will break production)
|
|
322
|
-
rm Migrations/20260216_CreateUserTable.cs
|
|
323
|
-
|
|
324
|
-
# ✅ CORRECT (rollback properly)
|
|
325
|
-
dotnet ef migrations remove
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
❌ **Don't use database.EnsureCreated() with migrations**
|
|
329
|
-
|
|
330
|
-
```csharp
|
|
331
|
-
// ❌ WRONG (conflicts with migrations)
|
|
332
|
-
context.Database.EnsureCreated();
|
|
333
|
-
|
|
334
|
-
// ✅ CORRECT
|
|
335
|
-
context.Database.Migrate();
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
---
|
|
339
|
-
|
|
340
|
-
## Troubleshooting
|
|
341
|
-
|
|
342
|
-
### Migration Pending Error
|
|
343
|
-
|
|
344
|
-
```
|
|
345
|
-
Error: Pending model changes detected
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
**Solution:**
|
|
349
|
-
|
|
350
|
-
```bash
|
|
351
|
-
dotnet ef migrations add FixPendingChanges
|
|
352
|
-
dotnet ef database update
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
### Migration Already Applied
|
|
356
|
-
|
|
357
|
-
```
|
|
358
|
-
Error: Migration 'xxx' has already been applied
|
|
359
|
-
```
|
|
360
|
-
|
|
361
|
-
**Solution:**
|
|
362
|
-
|
|
363
|
-
```bash
|
|
364
|
-
# Remove last migration (if not in prod)
|
|
365
|
-
dotnet ef migrations remove
|
|
366
|
-
|
|
367
|
-
# Or create new migration
|
|
368
|
-
dotnet ef migrations add AdditionalChanges
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
### Rollback Failed
|
|
372
|
-
|
|
373
|
-
```
|
|
374
|
-
Error: Could not rollback migration
|
|
375
|
-
```
|
|
376
|
-
|
|
377
|
-
**Solution:**
|
|
378
|
-
|
|
379
|
-
```bash
|
|
380
|
-
# Manually fix database state, then:
|
|
381
|
-
dotnet ef database update LastGoodMigration --force
|
|
382
|
-
```
|
|
383
|
-
|
|
384
|
-
---
|
|
385
|
-
|
|
386
|
-
## Related Standards
|
|
387
|
-
|
|
388
|
-
- [EF Core Standards](./ef-core.md)
|
|
389
|
-
- [Database Performance](./performance.md)
|
|
390
|
-
|
|
391
|
-
---
|
|
392
|
-
|
|
393
|
-
*MORPH-SPEC by Polymorphism Tech*
|