@polymorphism-tech/morph-spec 4.3.1 → 4.3.2

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 (192) hide show
  1. package/bin/morph-spec.js +1 -1
  2. package/package.json +2 -1
  3. package/src/commands/project/doctor.js +24 -18
  4. package/src/commands/project/init.js +1 -1
  5. package/src/commands/state/state.js +24 -2
  6. package/src/core/templates/template-registry.js +1 -1
  7. package/src/core/workflows/workflow-detector.js +2 -2
  8. package/stacks/blazor-azure/.claude/commands/morph-apply.md +221 -0
  9. package/stacks/blazor-azure/.claude/commands/morph-archive.md +79 -0
  10. package/stacks/blazor-azure/.claude/commands/morph-deploy.md +529 -0
  11. package/stacks/blazor-azure/.claude/commands/morph-infra.md +209 -0
  12. package/stacks/blazor-azure/.claude/commands/morph-preflight.md +227 -0
  13. package/stacks/blazor-azure/.claude/commands/morph-proposal.md +122 -0
  14. package/stacks/blazor-azure/.claude/commands/morph-status.md +86 -0
  15. package/stacks/blazor-azure/.claude/commands/morph-troubleshoot.md +122 -0
  16. package/stacks/blazor-azure/.morph/.morphversion +5 -5
  17. package/stacks/blazor-azure/.morph/archive/.gitkeep +25 -0
  18. package/stacks/blazor-azure/.morph/config/config.json +9 -0
  19. package/stacks/blazor-azure/.morph/features/.gitkeep +25 -0
  20. package/stacks/blazor-azure/.morph/project/context/README.md +17 -0
  21. package/stacks/blazor-azure/.morph/schemas/agent.schema.json +296 -0
  22. package/stacks/blazor-azure/.morph/schemas/tasks.schema.json +220 -0
  23. package/stacks/blazor-azure/.morph/specs/.gitkeep +20 -0
  24. package/stacks/blazor-azure/.morph/standards/ai-agents/blazor-ui.md +364 -0
  25. package/stacks/blazor-azure/.morph/standards/ai-agents/production.md +415 -0
  26. package/stacks/blazor-azure/.morph/standards/ai-agents/setup.md +418 -0
  27. package/stacks/blazor-azure/.morph/standards/ai-agents/team-orchestration.md +479 -0
  28. package/stacks/blazor-azure/.morph/standards/ai-agents/workflows.md +354 -0
  29. package/stacks/blazor-azure/.morph/standards/architecture/ddd/aggregates.md +120 -0
  30. package/stacks/blazor-azure/.morph/standards/architecture/ddd/entities.md +99 -0
  31. package/stacks/blazor-azure/.morph/standards/architecture/ddd/value-objects.md +124 -0
  32. package/stacks/blazor-azure/.morph/standards/backend/api/minimal-api.md +494 -0
  33. package/stacks/blazor-azure/.morph/standards/backend/api/rest.md +492 -0
  34. package/stacks/blazor-azure/.morph/standards/backend/api/validation.md +88 -0
  35. package/stacks/blazor-azure/.morph/standards/backend/authentication/passkeys.md +428 -0
  36. package/stacks/blazor-azure/.morph/standards/backend/database/ef-core.md +199 -0
  37. package/stacks/blazor-azure/.morph/standards/backend/database/migrations.md +393 -0
  38. package/stacks/blazor-azure/.morph/standards/backend/database/postgresql/database.md +352 -0
  39. package/stacks/blazor-azure/.morph/standards/backend/database/repository-patterns.md +528 -0
  40. package/stacks/blazor-azure/.morph/standards/backend/database/vector-search-rag.md +541 -0
  41. package/stacks/blazor-azure/.morph/standards/backend/dotnet/async.md +366 -0
  42. package/stacks/blazor-azure/.morph/standards/backend/dotnet/core.md +117 -0
  43. package/stacks/blazor-azure/.morph/standards/backend/dotnet/di.md +439 -0
  44. package/stacks/blazor-azure/.morph/standards/backend/dotnet/program-cs-checklist.md +92 -0
  45. package/stacks/blazor-azure/.morph/standards/backend/integrations/asaas/asaas-api.md +216 -0
  46. package/stacks/blazor-azure/.morph/standards/backend/integrations/clerk/clerk-auth.md +290 -0
  47. package/stacks/blazor-azure/.morph/standards/backend/integrations/hangfire/hangfire-jobs.md +350 -0
  48. package/stacks/blazor-azure/.morph/standards/backend/integrations/resend/resend-email.md +385 -0
  49. package/stacks/blazor-azure/.morph/standards/context/analytics.md +96 -0
  50. package/stacks/blazor-azure/.morph/standards/context/bundles.md +110 -0
  51. package/stacks/blazor-azure/.morph/standards/context/priming.md +78 -0
  52. package/stacks/blazor-azure/.morph/standards/core/architecture.md +185 -0
  53. package/stacks/blazor-azure/.morph/standards/core/coding.md +214 -0
  54. package/stacks/blazor-azure/.morph/standards/core/git-branching-strategy.md +403 -0
  55. package/stacks/blazor-azure/.morph/standards/core/git.md +185 -0
  56. package/stacks/blazor-azure/.morph/standards/core/testing.md +295 -0
  57. package/stacks/blazor-azure/.morph/standards/data/nosql/blob-storage.md +102 -0
  58. package/stacks/blazor-azure/.morph/standards/data/nosql/cache/redis.md +97 -0
  59. package/stacks/blazor-azure/.morph/standards/data/nosql/cosmos-db.md +118 -0
  60. package/stacks/blazor-azure/.morph/standards/data/vector-search/azure-ai-search.md +121 -0
  61. package/stacks/blazor-azure/.morph/standards/data/vector-search/rag-chunking.md +104 -0
  62. package/stacks/blazor-azure/.morph/standards/frontend/blazor/design-checklist.md +222 -0
  63. package/stacks/blazor-azure/.morph/standards/frontend/blazor/fluent-ui-setup.md +595 -0
  64. package/stacks/blazor-azure/.morph/standards/frontend/blazor/fluent-ui.md +137 -0
  65. package/stacks/blazor-azure/.morph/standards/frontend/blazor/html-conversion.md +184 -0
  66. package/stacks/blazor-azure/.morph/standards/frontend/blazor/lifecycle.md +195 -0
  67. package/stacks/blazor-azure/.morph/standards/frontend/blazor/pitfalls.md +198 -0
  68. package/stacks/blazor-azure/.morph/standards/frontend/blazor/state.md +191 -0
  69. package/stacks/blazor-azure/.morph/standards/frontend/design-system/animations.md +151 -0
  70. package/stacks/blazor-azure/.morph/standards/frontend/design-system/naming.md +64 -0
  71. package/stacks/blazor-azure/.morph/standards/frontend/nextjs/nextjs-patterns.md +198 -0
  72. package/stacks/blazor-azure/.morph/standards/infrastructure/azure/azure.md +624 -0
  73. package/stacks/blazor-azure/.morph/standards/infrastructure/azure/bicep/bicep-patterns.md +422 -0
  74. package/stacks/blazor-azure/.morph/standards/infrastructure/azure/devops/azure-devops-setup.md +516 -0
  75. package/stacks/blazor-azure/.morph/standards/infrastructure/azure/devops/local-development.md +520 -0
  76. package/stacks/blazor-azure/.morph/standards/infrastructure/azure/services/functions.md +486 -0
  77. package/stacks/blazor-azure/.morph/standards/infrastructure/azure/services/service-bus.md +459 -0
  78. package/stacks/blazor-azure/.morph/standards/infrastructure/azure/services/storage.md +407 -0
  79. package/stacks/blazor-azure/.morph/standards/infrastructure/docker/easypanel-deploy.md +196 -0
  80. package/stacks/blazor-azure/.morph/standards/infrastructure/supabase/mcp-setup.md +252 -0
  81. package/stacks/blazor-azure/.morph/standards/infrastructure/supabase/supabase-auth.md +176 -0
  82. package/stacks/blazor-azure/.morph/standards/infrastructure/supabase/supabase-pgvector.md +169 -0
  83. package/stacks/blazor-azure/.morph/standards/infrastructure/supabase/supabase-rls.md +184 -0
  84. package/stacks/blazor-azure/.morph/standards/infrastructure/supabase/supabase-storage.md +153 -0
  85. package/stacks/blazor-azure/.morph/standards/integration/api/graphql.md +91 -0
  86. package/stacks/blazor-azure/.morph/standards/integration/api/grpc.md +114 -0
  87. package/stacks/blazor-azure/.morph/standards/integration/api/rest-design.md +95 -0
  88. package/stacks/blazor-azure/.morph/standards/integration/event-driven/cqrs.md +101 -0
  89. package/stacks/blazor-azure/.morph/standards/integration/event-driven/event-sourcing.md +124 -0
  90. package/stacks/blazor-azure/.morph/standards/integration/event-driven/service-bus.md +95 -0
  91. package/stacks/blazor-azure/.morph/standards/observability/logging.md +131 -0
  92. package/stacks/blazor-azure/.morph/standards/observability/metrics.md +121 -0
  93. package/stacks/blazor-azure/.morph/standards/observability/monitoring.md +114 -0
  94. package/stacks/blazor-azure/.morph/standards/observability/tracing.md +132 -0
  95. package/stacks/blazor-azure/.morph/standards/workflows/parallel-execution.md +112 -0
  96. package/stacks/blazor-azure/.morph/standards/workflows/thread-management.md +113 -0
  97. package/stacks/blazor-azure/.morph/test-infra/example.bicep +59 -0
  98. package/stacks/blazor-azure/CLAUDE.md +106 -101
  99. package/stacks/nextjs-supabase/.claude/commands/morph-apply.md +221 -0
  100. package/stacks/nextjs-supabase/.claude/commands/morph-archive.md +79 -0
  101. package/stacks/nextjs-supabase/.claude/commands/morph-deploy.md +529 -0
  102. package/stacks/nextjs-supabase/.claude/commands/morph-infra.md +209 -0
  103. package/stacks/nextjs-supabase/.claude/commands/morph-preflight.md +227 -0
  104. package/stacks/nextjs-supabase/.claude/commands/morph-proposal.md +122 -0
  105. package/stacks/nextjs-supabase/.claude/commands/morph-status.md +86 -0
  106. package/stacks/nextjs-supabase/.claude/commands/morph-troubleshoot.md +122 -0
  107. package/stacks/nextjs-supabase/.morph/.morphversion +5 -0
  108. package/stacks/nextjs-supabase/.morph/config/agents.json +730 -127
  109. package/stacks/nextjs-supabase/.morph/config/config.json +9 -0
  110. package/stacks/nextjs-supabase/.morph/project/context/README.md +17 -0
  111. package/stacks/nextjs-supabase/.morph/standards/ai-agents/blazor-ui.md +364 -0
  112. package/stacks/nextjs-supabase/.morph/standards/ai-agents/production.md +415 -0
  113. package/stacks/nextjs-supabase/.morph/standards/ai-agents/setup.md +418 -0
  114. package/stacks/nextjs-supabase/.morph/standards/ai-agents/team-orchestration.md +479 -0
  115. package/stacks/nextjs-supabase/.morph/standards/ai-agents/workflows.md +354 -0
  116. package/stacks/nextjs-supabase/.morph/standards/architecture/ddd/aggregates.md +120 -0
  117. package/stacks/nextjs-supabase/.morph/standards/architecture/ddd/entities.md +99 -0
  118. package/stacks/nextjs-supabase/.morph/standards/architecture/ddd/value-objects.md +124 -0
  119. package/stacks/nextjs-supabase/.morph/standards/backend/api/minimal-api.md +494 -0
  120. package/stacks/nextjs-supabase/.morph/standards/backend/api/rest.md +492 -0
  121. package/stacks/nextjs-supabase/.morph/standards/backend/api/validation.md +88 -0
  122. package/stacks/nextjs-supabase/.morph/standards/backend/authentication/passkeys.md +428 -0
  123. package/stacks/nextjs-supabase/.morph/standards/backend/database/ef-core.md +199 -0
  124. package/stacks/nextjs-supabase/.morph/standards/backend/database/migrations.md +393 -0
  125. package/stacks/nextjs-supabase/.morph/standards/backend/database/postgresql/database.md +352 -0
  126. package/stacks/nextjs-supabase/.morph/standards/backend/database/repository-patterns.md +528 -0
  127. package/stacks/nextjs-supabase/.morph/standards/backend/database/vector-search-rag.md +541 -0
  128. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/async.md +366 -0
  129. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/core.md +117 -0
  130. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/di.md +439 -0
  131. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/program-cs-checklist.md +92 -0
  132. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/asaas/asaas-api.md +216 -0
  133. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/clerk/clerk-auth.md +290 -0
  134. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/hangfire/hangfire-jobs.md +350 -0
  135. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/resend/resend-email.md +385 -0
  136. package/stacks/nextjs-supabase/.morph/standards/context/analytics.md +96 -0
  137. package/stacks/nextjs-supabase/.morph/standards/context/bundles.md +110 -0
  138. package/stacks/nextjs-supabase/.morph/standards/context/priming.md +78 -0
  139. package/stacks/nextjs-supabase/.morph/standards/core/architecture.md +185 -0
  140. package/stacks/nextjs-supabase/.morph/standards/core/coding.md +214 -0
  141. package/stacks/nextjs-supabase/.morph/standards/core/git-branching-strategy.md +403 -0
  142. package/stacks/nextjs-supabase/.morph/standards/core/git.md +185 -0
  143. package/stacks/nextjs-supabase/.morph/standards/core/testing.md +295 -0
  144. package/stacks/nextjs-supabase/.morph/standards/data/nosql/blob-storage.md +102 -0
  145. package/stacks/nextjs-supabase/.morph/standards/data/nosql/cache/redis.md +97 -0
  146. package/stacks/nextjs-supabase/.morph/standards/data/nosql/cosmos-db.md +118 -0
  147. package/stacks/nextjs-supabase/.morph/standards/data/vector-search/azure-ai-search.md +121 -0
  148. package/stacks/nextjs-supabase/.morph/standards/data/vector-search/rag-chunking.md +104 -0
  149. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/design-checklist.md +222 -0
  150. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/fluent-ui-setup.md +595 -0
  151. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/fluent-ui.md +137 -0
  152. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/html-conversion.md +184 -0
  153. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/lifecycle.md +195 -0
  154. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/pitfalls.md +198 -0
  155. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/state.md +191 -0
  156. package/stacks/nextjs-supabase/.morph/standards/frontend/design-system/animations.md +151 -0
  157. package/stacks/nextjs-supabase/.morph/standards/frontend/design-system/naming.md +64 -0
  158. package/stacks/nextjs-supabase/.morph/standards/frontend/nextjs/nextjs-patterns.md +198 -0
  159. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/azure.md +624 -0
  160. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/bicep/bicep-patterns.md +422 -0
  161. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/devops/azure-devops-setup.md +516 -0
  162. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/devops/local-development.md +520 -0
  163. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/services/functions.md +486 -0
  164. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/services/service-bus.md +459 -0
  165. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/services/storage.md +407 -0
  166. package/stacks/nextjs-supabase/.morph/standards/infrastructure/docker/easypanel-deploy.md +196 -0
  167. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/mcp-setup.md +252 -0
  168. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-auth.md +176 -0
  169. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-pgvector.md +169 -0
  170. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-rls.md +184 -0
  171. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-storage.md +153 -0
  172. package/stacks/nextjs-supabase/.morph/standards/integration/api/graphql.md +91 -0
  173. package/stacks/nextjs-supabase/.morph/standards/integration/api/grpc.md +114 -0
  174. package/stacks/nextjs-supabase/.morph/standards/integration/api/rest-design.md +95 -0
  175. package/stacks/nextjs-supabase/.morph/standards/integration/event-driven/cqrs.md +101 -0
  176. package/stacks/nextjs-supabase/.morph/standards/integration/event-driven/event-sourcing.md +124 -0
  177. package/stacks/nextjs-supabase/.morph/standards/integration/event-driven/service-bus.md +95 -0
  178. package/stacks/nextjs-supabase/.morph/standards/observability/logging.md +131 -0
  179. package/stacks/nextjs-supabase/.morph/standards/observability/metrics.md +121 -0
  180. package/stacks/nextjs-supabase/.morph/standards/observability/monitoring.md +114 -0
  181. package/stacks/nextjs-supabase/.morph/standards/observability/tracing.md +132 -0
  182. package/stacks/nextjs-supabase/.morph/standards/workflows/parallel-execution.md +112 -0
  183. package/stacks/nextjs-supabase/.morph/standards/workflows/thread-management.md +113 -0
  184. package/stacks/nextjs-supabase/CLAUDE.md +69 -63
  185. package/stacks/blazor-azure/.morph/templates/.gitkeep +0 -0
  186. package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/cd-prod.yml.hbs +0 -41
  187. package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/cd-staging.yml.hbs +0 -24
  188. package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/ci-build.yml.hbs +0 -23
  189. package/stacks/nextjs-supabase/.morph/templates/.gitkeep +0 -0
  190. package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/cd-prod.yml.hbs +0 -22
  191. package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/cd-staging.yml.hbs +0 -22
  192. package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/ci-build.yml.hbs +0 -35
@@ -0,0 +1,393 @@
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*