You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .squad/agents/biff/history.md
+20Lines changed: 20 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -68,3 +68,23 @@
68
68
**Key Insight:** Doc's fixes were **surgical and precise** — they changed only what was broken, didn't refactor unnecessarily. Every fix matched my recommended solution exactly. This is ideal remediation.
69
69
70
70
**Process Win:** The coordinator clarified that the Employee domain choice was actually Doc's decision as team lead, not a rogue deviation by Marty. This saved needless refactoring back to Product Pricing. Good escalation practice.
- ✅ **Demo Quality:** Console output formatting is audience-friendly; code comments link EF Core LINQ to Demo 1's T-SQL equivalents; runtime ~7–10 seconds
84
+
- ✅ **Configuration:** Targets .NET 8; EF Core 8 SQL Server package correct; secrets properly gitignored with appsettings.example.json template
85
+
86
+
**Minor Suggestion (Non-Blocking):** TemporalBetween and TemporalFromTo may return identical results due to "safe" timestamp boundaries outside transaction windows. Acceptable for the demo—showcasing both API methods is valuable for audience.
87
+
88
+
**Status:** Ready for Chad to present.
89
+
90
+
**Process Note:** This demo demonstrates excellent complementarity with Demo 1 (SQL)—same Employee domain narrative, both leverage Azure SQL temporal tables, all query patterns mapped between T-SQL and EF Core LINQ.
**Task:** Add TemporalEFDemo database to Terraform for Demo 2 (EF Core)
119
+
120
+
### Changes Made
121
+
-**main.tf:** Added `azurerm_mssql_database` resource for TemporalEFDemo
122
+
- Same Azure SQL Server as TemporalSQLDemo (Demo 1)
123
+
- Consistent SKU and configuration
124
+
- Follows naming and variable conventions
125
+
-**outputs.tf:** Added `temporal_ef_demo_db_name` and `temporal_ef_demo_connection_string` outputs
126
+
127
+
### Verification
128
+
✅ Terraform configuration valid
129
+
✅ Database resource correctly integrated with existing server infrastructure
130
+
✅ Connection strings available for Jennifer's EF Core app configuration
131
+
132
+
### Architecture Note
133
+
Same-server strategy confirmed by Chad—both Demo 1 (SQL) and Demo 2 (EF Core) run independently on single Azure SQL server with separate databases (TemporalSQLDemo and TemporalEFDemo).
Copy file name to clipboardExpand all lines: .squad/decisions.md
+79Lines changed: 79 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1752,3 +1752,82 @@ ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
1752
1752
---
1753
1753
1754
1754
1755
+
1756
+
1757
+
---
1758
+
1759
+
# Decision: EF Core Demo Structure
1760
+
1761
+
**Author:** Jennifer
1762
+
**Date:** 2026-03-02
1763
+
**Status:** Proposed
1764
+
1765
+
## Context
1766
+
1767
+
Demo 2 (EFCoreDemoFast) needed an EF Core 8 project showing temporal table support for the "Time Travelling Data" 20-minute conference presentation.
1768
+
1769
+
## Decisions Made
1770
+
1771
+
### 1. Database: TemporalEFDemo (separate from Demo 1)
1772
+
Demo 2 uses a **different database** (`TemporalEFDemo`) on the same Azure SQL server as Demo 1 (`TemporalSQLDemo`). No cross-dependency between demos. Each demo is fully self-contained.
1773
+
1774
+
### 2. Employee Domain — consistent with Demo 1
1775
+
Carried over Alice Hart, Bob Chen, Carol Reyes, David Kim with the same starting salaries and titles. Demo narrative is identical (Alice promoted, David terminated) so the audience sees the same story told in two different ways.
1776
+
1777
+
### 3. C# DateTime capture (no hardcoded timestamps)
1778
+
Rather than hardcoding SQL timestamps like Demo 1 does for T-SQL demos, Demo 2 captures `DateTime seedTime` and `DateTime afterChanges` as C# variables during execution. This shows the natural C# developer workflow and avoids the "magic strings" problem in live demos.
1779
+
1780
+
### 4. All 5 temporal LINQ extensions demonstrated
1781
+
-`TemporalAll()` → `FOR SYSTEM_TIME ALL`
1782
+
-`TemporalAsOf()` → `FOR SYSTEM_TIME AS OF`
1783
+
-`TemporalBetween()` → `FOR SYSTEM_TIME BETWEEN`
1784
+
-`TemporalFromTo()` → `FOR SYSTEM_TIME FROM ... TO`
Each LINQ call maps to its T-SQL equivalent (shown in comments) to bridge the two demos for the audience.
1788
+
1789
+
### 5. No period columns on POCO
1790
+
PeriodStart/PeriodEnd are EF shadow properties only. The Employee POCO is intentionally minimal — demonstrates that temporal behavior is infrastructure, not domain model concern.
1791
+
1792
+
### 6. Migration hand-crafted with fake timestamp
1793
+
The migration file uses `20240101000000` as a timestamp. This is fine — it just needs to be a valid date string for EF ordering. This avoids requiring `dotnet ef migrations add` at setup time.
1794
+
1795
+
### 7. appsettings.json gitignored
1796
+
Connection string lives in `appsettings.json` (gitignored). `appsettings.example.json` committed with placeholder values. Presenter updates `appsettings.json` before the demo.
1797
+
1798
+
1799
+
---
1800
+
1801
+
# Biff's Review of EF Core Demo (Demo 2)
1802
+
1803
+
## Review Verdict: APPROVED ✅
1804
+
1805
+
I have thoroughly reviewed the EF Core demo project (`Demos/EFCoreDemoFast`) and found it to be high-quality, correct, and demo-ready.
1806
+
1807
+
### 1. Correctness & Logic
1808
+
-**Temporal Configuration:** The `IsTemporal()` configuration in `TemporalContext.cs` correctly maps to the `20240101000000_InitialCreate.cs` migration. The history table `EmployeesHistory` is correctly defined.
1809
+
-**Idempotency:**`ExecuteDeleteAsync()` at the start of `Program.cs` ensures the demo can be run repeatedly without duplicating data. `MigrateAsync()` ensures the database is created.
1810
+
-**Seeding & Timing:**
1811
+
-`seedTime` is captured *after*`SaveChangesAsync()`, ensuring the seeded rows have `PeriodStart` timestamps <= `seedTime`.
1812
+
- The 3-second delay (`Task.Delay(3000)`) provides a safe buffer ensuring `seedTime.AddSeconds(1)` falls strictly between the seed transaction and the update transaction.
1813
+
-`afterChanges` is captured correctly after the second transaction.
1814
+
1815
+
### 2. Temporal Query Validation
1816
+
-**TemporalAsOf:**`TemporalAsOf(seedTime.AddSeconds(1))` will correctly return all 4 original employees (Alice, Bob, Carol, David). The query time (T_seed + 1s) is guaranteed to be before the updates (T_seed + 3s). The expected output in README correctly shows all 4.
1817
+
-**TemporalContainedIn:** David's row is created at T_seed and deleted at T_update. The query window `(seedTime - 1s, afterChanges + 1s)` fully encompasses David's valid period `[T_seed, T_update)`. This is correct.
1818
+
-**TemporalBetween vs FromTo:** The distinction is subtle but the code uses them correctly. Given the timestamps are derived from execution time, the results will likely be identical in this specific run, but showcasing both API methods is valuable for the audience.
1819
+
1820
+
### 3. Demo Quality
1821
+
-**Readability:** The console output (using `Console.WriteLine` with table formatting) is excellent and audience-friendly.
1822
+
-**Code Clarity:** The comments in `Program.cs` effectively link the EF Core LINQ methods to their T-SQL counterparts from Demo 1 (e.g., `// LINQ: ...TemporalAll()`, `// T-SQL: ...FOR SYSTEM_TIME ALL`).
1823
+
-**Timing:** The demo is concise. Migration check (~1s) + Seed (~1s) + Wait (3s) + Update (~1s) + Queries (~1s) = ~7-10 seconds runtime. The 2-minute script estimate allows ample time for the speaker to explain the code.
1824
+
1825
+
### 4. Configuration
1826
+
-**Project File:** Correctly targets .NET 8 and uses `Microsoft.EntityFrameworkCore.SqlServer` 8.0.0.
1827
+
-**Secrets:**`appsettings.json` is correctly in `.gitignore`. `appsettings.example.json` provides a safe template.
1828
+
1829
+
### Minor Suggestion (Non-Blocking)
1830
+
- The `TemporalBetween` and `TemporalFromTo` queries might return identical results in this specific scenario because the start/end points are "safe" timestamps outside the transaction boundaries. This is acceptable for the demo as it proves the API works, even if it doesn't highlight the edge-case boundary differences (which are hard to demo reliably with live execution timing).
TemporalBetween and TemporalFromTo may return identical results due to "safe" timestamp boundaries outside transaction windows. Acceptable for the demo.
0 commit comments