@polymorphism-tech/morph-spec 4.6.0 → 4.7.0

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.
Files changed (239) hide show
  1. package/README.md +394 -700
  2. package/docs/ARCHITECTURE.md +331 -0
  3. package/docs/CHEATSHEET.md +221 -0
  4. package/docs/COMMAND-FLOWS.md +368 -0
  5. package/docs/QUICKSTART.md +212 -0
  6. package/docs/examples/order-management/contracts.cs +84 -0
  7. package/docs/examples/order-management/proposal.md +24 -0
  8. package/docs/examples/order-management/spec.md +162 -0
  9. package/docs/plans/2026-02-23-ddd-architecture-refactor.md +1153 -0
  10. package/docs/plans/2026-02-23-ddd-nextsteps.md +682 -0
  11. package/docs/plans/2026-02-23-infra-architect-refactor.md +437 -0
  12. package/docs/plans/2026-02-23-nextjs-code-review-design.md +156 -0
  13. package/docs/plans/2026-02-23-nextjs-code-review-impl.md +1254 -0
  14. package/docs/plans/2026-02-23-nextjs-standards-design.md +149 -0
  15. package/docs/plans/2026-02-23-nextjs-standards-impl.md +1846 -0
  16. package/framework/agents/README.md +14 -14
  17. package/framework/agents/architecture/standards-architect.md +159 -159
  18. package/framework/agents/frontend/nextjs-expert.md +87 -127
  19. package/framework/agents/infrastructure/azure-architect.md +147 -147
  20. package/framework/agents/infrastructure/infra-architect.md +45 -0
  21. package/framework/agents.json +1145 -278
  22. package/framework/rules/frontend-standards.md +0 -3
  23. package/framework/rules/nextjs-standards.md +17 -0
  24. package/framework/skills/level-0-meta/code-review-nextjs/SKILL.md +147 -0
  25. package/framework/skills/level-0-meta/code-review-nextjs/references/review-example-nextjs.md +254 -0
  26. package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +3 -3
  27. package/framework/skills/level-1-workflows/phase-design/SKILL.md +45 -9
  28. package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +38 -0
  29. package/framework/standards/STANDARDS.json +121 -0
  30. package/framework/standards/architecture/ddd/bounded-contexts.md +105 -0
  31. package/framework/standards/architecture/ddd/complexity-levels.md +108 -0
  32. package/framework/standards/architecture/ddd/ubiquitous-language.md +58 -0
  33. package/framework/standards/frontend/nextjs/app-router.md +123 -0
  34. package/framework/standards/frontend/nextjs/components.md +132 -0
  35. package/framework/standards/frontend/nextjs/data-fetching.md +126 -0
  36. package/framework/standards/frontend/nextjs/forms.md +128 -0
  37. package/framework/standards/frontend/nextjs/naming-conventions.md +67 -0
  38. package/framework/standards/frontend/nextjs/project-structure.md +102 -0
  39. package/framework/standards/frontend/nextjs/state-management.md +72 -0
  40. package/framework/standards/frontend/nextjs/testing.md +111 -0
  41. package/framework/templates/REGISTRY.json +538 -142
  42. package/framework/templates/code/dotnet/contracts/contracts-level1.cs +69 -0
  43. package/framework/templates/code/dotnet/contracts/contracts-level2.cs +86 -0
  44. package/framework/templates/code/dotnet/contracts/contracts-level3.cs +41 -0
  45. package/framework/templates/docs/spec.md +49 -0
  46. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -0
  47. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -0
  48. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -0
  49. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -0
  50. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -0
  51. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -0
  52. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -0
  53. package/framework/templates/project-structure/dotnet-ddd.md +70 -0
  54. package/framework/workflows/docs/enforcement-pipeline.md +2 -1
  55. package/package.json +1 -1
  56. package/scripts/scan-nextjs.mjs +169 -0
  57. package/src/commands/project/doctor.js +52 -1
  58. package/src/commands/project/init.js +15 -1
  59. package/src/commands/project/update.js +6 -1
  60. package/src/lib/standards/standards-context-injector.js +5 -0
  61. package/src/lib/validators/nextjs/index.js +6 -0
  62. package/src/lib/validators/nextjs/next-component-validator.js +181 -0
  63. package/src/lib/validators/validation-runner.js +5 -0
  64. package/src/utils/agents-installer.js +14 -2
  65. package/.morph/.morphversion +0 -5
  66. package/.morph/analytics/threads-log.jsonl +0 -6
  67. package/.morph/config/config.json +0 -8
  68. package/.morph/framework/agents.json +0 -948
  69. package/.morph/framework/standards/STANDARDS.json +0 -812
  70. package/.morph/framework/standards/ai-agents/blazor-ui.md +0 -364
  71. package/.morph/framework/standards/ai-agents/production.md +0 -415
  72. package/.morph/framework/standards/ai-agents/setup.md +0 -418
  73. package/.morph/framework/standards/ai-agents/team-orchestration.md +0 -479
  74. package/.morph/framework/standards/ai-agents/workflows.md +0 -354
  75. package/.morph/framework/standards/architecture/ddd/aggregates.md +0 -120
  76. package/.morph/framework/standards/architecture/ddd/entities.md +0 -99
  77. package/.morph/framework/standards/architecture/ddd/value-objects.md +0 -124
  78. package/.morph/framework/standards/backend/api/minimal-api.md +0 -494
  79. package/.morph/framework/standards/backend/api/rest.md +0 -492
  80. package/.morph/framework/standards/backend/api/validation.md +0 -88
  81. package/.morph/framework/standards/backend/authentication/passkeys.md +0 -428
  82. package/.morph/framework/standards/backend/database/ef-core.md +0 -199
  83. package/.morph/framework/standards/backend/database/migrations.md +0 -393
  84. package/.morph/framework/standards/backend/database/postgresql/database.md +0 -352
  85. package/.morph/framework/standards/backend/database/repository-patterns.md +0 -528
  86. package/.morph/framework/standards/backend/database/vector-search-rag.md +0 -541
  87. package/.morph/framework/standards/backend/dotnet/async.md +0 -366
  88. package/.morph/framework/standards/backend/dotnet/core.md +0 -117
  89. package/.morph/framework/standards/backend/dotnet/di.md +0 -439
  90. package/.morph/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
  91. package/.morph/framework/standards/backend/integrations/asaas/asaas-api.md +0 -216
  92. package/.morph/framework/standards/backend/integrations/clerk/clerk-auth.md +0 -290
  93. package/.morph/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
  94. package/.morph/framework/standards/backend/integrations/resend/resend-email.md +0 -385
  95. package/.morph/framework/standards/context/analytics.md +0 -96
  96. package/.morph/framework/standards/context/bundles.md +0 -110
  97. package/.morph/framework/standards/context/priming.md +0 -78
  98. package/.morph/framework/standards/core/architecture.md +0 -185
  99. package/.morph/framework/standards/core/coding.md +0 -214
  100. package/.morph/framework/standards/core/git-branching-strategy.md +0 -403
  101. package/.morph/framework/standards/core/git.md +0 -185
  102. package/.morph/framework/standards/core/testing.md +0 -295
  103. package/.morph/framework/standards/data/nosql/blob-storage.md +0 -102
  104. package/.morph/framework/standards/data/nosql/cache/redis.md +0 -97
  105. package/.morph/framework/standards/data/nosql/cosmos-db.md +0 -118
  106. package/.morph/framework/standards/data/vector-search/azure-ai-search.md +0 -121
  107. package/.morph/framework/standards/data/vector-search/rag-chunking.md +0 -104
  108. package/.morph/framework/standards/frontend/blazor/design-checklist.md +0 -222
  109. package/.morph/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
  110. package/.morph/framework/standards/frontend/blazor/fluent-ui.md +0 -137
  111. package/.morph/framework/standards/frontend/blazor/html-conversion.md +0 -184
  112. package/.morph/framework/standards/frontend/blazor/lifecycle.md +0 -195
  113. package/.morph/framework/standards/frontend/blazor/pitfalls.md +0 -198
  114. package/.morph/framework/standards/frontend/blazor/state.md +0 -191
  115. package/.morph/framework/standards/frontend/design-system/animations.md +0 -151
  116. package/.morph/framework/standards/frontend/design-system/naming.md +0 -64
  117. package/.morph/framework/standards/frontend/nextjs/nextjs-patterns.md +0 -215
  118. package/.morph/framework/standards/infrastructure/azure/azure.md +0 -624
  119. package/.morph/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
  120. package/.morph/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
  121. package/.morph/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
  122. package/.morph/framework/standards/infrastructure/azure/services/functions.md +0 -486
  123. package/.morph/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
  124. package/.morph/framework/standards/infrastructure/azure/services/storage.md +0 -407
  125. package/.morph/framework/standards/infrastructure/docker/easypanel-deploy.md +0 -196
  126. package/.morph/framework/standards/infrastructure/supabase/mcp-setup.md +0 -252
  127. package/.morph/framework/standards/infrastructure/supabase/supabase-auth.md +0 -176
  128. package/.morph/framework/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
  129. package/.morph/framework/standards/infrastructure/supabase/supabase-rls.md +0 -184
  130. package/.morph/framework/standards/infrastructure/supabase/supabase-storage.md +0 -153
  131. package/.morph/framework/standards/integration/api/graphql.md +0 -91
  132. package/.morph/framework/standards/integration/api/grpc.md +0 -114
  133. package/.morph/framework/standards/integration/api/rest-design.md +0 -95
  134. package/.morph/framework/standards/integration/event-driven/cqrs.md +0 -101
  135. package/.morph/framework/standards/integration/event-driven/event-sourcing.md +0 -124
  136. package/.morph/framework/standards/integration/event-driven/service-bus.md +0 -95
  137. package/.morph/framework/standards/integration/mcp/mcp-tools.md +0 -384
  138. package/.morph/framework/standards/observability/logging.md +0 -131
  139. package/.morph/framework/standards/observability/metrics.md +0 -121
  140. package/.morph/framework/standards/observability/monitoring.md +0 -114
  141. package/.morph/framework/standards/observability/tracing.md +0 -132
  142. package/.morph/framework/standards/workflows/parallel-execution.md +0 -112
  143. package/.morph/framework/standards/workflows/thread-management.md +0 -113
  144. package/.morph/framework/templates/.idea/morph-templates.xml +0 -92
  145. package/.morph/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  146. package/.morph/framework/templates/IDE-SNIPPETS.md +0 -266
  147. package/.morph/framework/templates/README.md +0 -814
  148. package/.morph/framework/templates/REGISTRY.json +0 -1492
  149. package/.morph/framework/templates/code/dotnet/backend/repository.cs +0 -141
  150. package/.morph/framework/templates/code/dotnet/backend/service.cs +0 -139
  151. package/.morph/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
  152. package/.morph/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
  153. package/.morph/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
  154. package/.morph/framework/templates/code/dotnet/contracts/README.md +0 -74
  155. package/.morph/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
  156. package/.morph/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
  157. package/.morph/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
  158. package/.morph/framework/templates/code/dotnet/database/migration.cs +0 -83
  159. package/.morph/framework/templates/code/dotnet/frontend/component.razor +0 -239
  160. package/.morph/framework/templates/code/dotnet/jobs/agent.cs +0 -163
  161. package/.morph/framework/templates/code/dotnet/jobs/job.cs +0 -171
  162. package/.morph/framework/templates/code/dotnet/test.cs +0 -239
  163. package/.morph/framework/templates/code/sql/rls-policy.sql +0 -57
  164. package/.morph/framework/templates/code/sql/supabase-migration.sql +0 -100
  165. package/.morph/framework/templates/code/sql/supabase-migration.template.sql +0 -113
  166. package/.morph/framework/templates/code/typescript/contracts.ts +0 -168
  167. package/.morph/framework/templates/context/CONTEXT-FEATURE.md +0 -276
  168. package/.morph/framework/templates/context/CONTEXT.md +0 -181
  169. package/.morph/framework/templates/docs/clarifications.md +0 -253
  170. package/.morph/framework/templates/docs/onboarding.md +0 -123
  171. package/.morph/framework/templates/docs/proposal.md +0 -182
  172. package/.morph/framework/templates/docs/schema-analysis.md +0 -119
  173. package/.morph/framework/templates/docs/spec.md +0 -149
  174. package/.morph/framework/templates/docs/ui-components.md +0 -124
  175. package/.morph/framework/templates/docs/ui-design-system.md +0 -76
  176. package/.morph/framework/templates/docs/ui-flows.md +0 -167
  177. package/.morph/framework/templates/docs/ui-mockups.md +0 -98
  178. package/.morph/framework/templates/docs/user-stories.md +0 -34
  179. package/.morph/framework/templates/examples/design-system-examples.md +0 -357
  180. package/.morph/framework/templates/examples/spec-examples.md +0 -90
  181. package/.morph/framework/templates/feature/decisions.md +0 -187
  182. package/.morph/framework/templates/feature/recap.md +0 -146
  183. package/.morph/framework/templates/feature/tasks.md +0 -199
  184. package/.morph/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
  185. package/.morph/framework/templates/infrastructure/azure/README.md +0 -286
  186. package/.morph/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
  187. package/.morph/framework/templates/infrastructure/azure/app-service.bicep +0 -164
  188. package/.morph/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
  189. package/.morph/framework/templates/infrastructure/azure/container-app.bicep +0 -156
  190. package/.morph/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
  191. package/.morph/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
  192. package/.morph/framework/templates/infrastructure/azure/deploy.sh +0 -208
  193. package/.morph/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
  194. package/.morph/framework/templates/infrastructure/azure/main.bicep +0 -189
  195. package/.morph/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
  196. package/.morph/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
  197. package/.morph/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
  198. package/.morph/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
  199. package/.morph/framework/templates/infrastructure/azure/storage.bicep +0 -106
  200. package/.morph/framework/templates/infrastructure/docker/Dockerfile.template +0 -58
  201. package/.morph/framework/templates/infrastructure/docker/docker-compose.template.yml +0 -67
  202. package/.morph/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +0 -38
  203. package/.morph/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +0 -48
  204. package/.morph/framework/templates/infrastructure/docker/easypanel.template.json +0 -54
  205. package/.morph/framework/templates/infrastructure/github/README.md +0 -593
  206. package/.morph/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
  207. package/.morph/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -45
  208. package/.morph/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +0 -27
  209. package/.morph/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
  210. package/.morph/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -31
  211. package/.morph/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -59
  212. package/.morph/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -39
  213. package/.morph/framework/templates/integrations/asaas-client.cs +0 -387
  214. package/.morph/framework/templates/integrations/asaas-webhook.cs +0 -351
  215. package/.morph/framework/templates/integrations/azure-identity-config.cs +0 -288
  216. package/.morph/framework/templates/integrations/clerk-config.cs +0 -258
  217. package/.morph/framework/templates/meta-prompts/fusion/fusion-agent.md +0 -76
  218. package/.morph/framework/templates/meta-prompts/fusion/fusion-aggregator.md +0 -100
  219. package/.morph/framework/templates/meta-prompts/hops/hop-retry.md +0 -78
  220. package/.morph/framework/templates/meta-prompts/hops/hop-validation.md +0 -97
  221. package/.morph/framework/templates/meta-prompts/hops/hop-wrapper.md +0 -36
  222. package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +0 -113
  223. package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +0 -80
  224. package/.morph/framework/templates/meta-prompts/squad-leaders/backend-squad.md +0 -90
  225. package/.morph/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +0 -126
  226. package/.morph/framework/templates/meta-prompts/squad-leaders/squad-leader.md +0 -43
  227. package/.morph/framework/templates/meta-prompts/validators/checkpoint-validator.md +0 -107
  228. package/.morph/framework/templates/meta-prompts/validators/pre-commit-validator.md +0 -95
  229. package/.morph/framework/templates/saas/subscription.cs +0 -347
  230. package/.morph/framework/templates/saas/tenant.cs +0 -338
  231. package/.morph/framework/templates/state.template.json +0 -17
  232. package/.morph/framework/templates/ui/FluentDesignTheme.cs +0 -149
  233. package/.morph/framework/templates/ui/MudTheme.cs +0 -281
  234. package/.morph/framework/templates/ui/design-system.css +0 -226
  235. package/.morph/logs/tool-failures.log +0 -7
  236. package/.morph/memory/pre-compact-2026-02-23T15-43-03-521Z.json +0 -16
  237. package/.morph/state.json +0 -48
  238. package/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
  239. 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*