Date: 2025-12-30 Last Synced Commits:
a16fb5b (Dec 29, 2025)cb0db17 (Dec 29, 2025)New Commits to Review:
4c83d45 (Dec 31, 2025) - version 9.21.09e62dda (Dec 30, 2025)Source: docs/mapper-methods.md in Neatoo repo, commit 013a51e
Change:
MapFrom and MapTo are now manually implemented (no longer source-generated)MapModifiedTo remains source-generated by NeatooSite pages to update:
_pages/reference/data-mapping.mdSource: docs/todos/save-reassignment-pattern.md in Neatoo repo (marked completed 2025-12-29)
Key Point: Save() returns a new deserialized instance - must be captured:
person = await person.Save(); // CORRECT
await person.Save(); // WRONG - stale object
Consequences of forgetting:
Site pages to check/update:
_pages/reference/factory-operations.md_pages/guides/blazor-integration.md_pages/guides/troubleshooting.mdSource: docs/todos/async-tasks-design-rationale.md in Neatoo repo
Key Points:
await entity.WaitForTasks() before checking validityIsBusy property indicates async operations in progressPattern:
person.FirstName = "John"; // Triggers async rules
person.Email = "a@b.com"; // More async rules
await person.WaitForTasks(); // Wait for all to complete
Assert.IsTrue(person.IsValid);
Site pages to check/update:
_pages/concepts/rules-overview.md_pages/reference/rules-engine.md_pages/guides/database-dependent-validation.mdSource: docs/todos/listbase-parent-behavior.md in Neatoo repo
Key Point: When items are added to ListBase<T>, their Parent is set to the list’s parent (grandparent), not the list itself.
Person (aggregate root)
└── PersonPhoneList (child list)
└── PersonPhone → Parent = Person (NOT PersonPhoneList)
Correct access pattern:
public IPerson? ParentPerson => this.Parent as IPerson; // Correct
Common mistake:
public IPerson? ParentPerson => this.Parent?.Parent as IPerson; // WRONG
Site pages to check/update:
_pages/reference/entity-list-base.md_pages/concepts/aggregates.mdStatus: ⚠️ NEEDS UPDATE
| File | Current State | Issue |
|---|---|---|
data-mapping.md |
✅ Uses explicit LoadProperty() and property assignments |
OK - no MapFrom/MapTo references |
factory-operations.md |
❌ Shows MapFrom/MapTo as partial (source-generated) |
OUTDATED - Lines 690-692 show all three as partial |
Required Changes:
factory-operations.md examples to show:
MapFrom as manually implemented (not partial)MapTo as manually implemented (not partial)MapModifiedTo remains source-generated (partial)Status: ✅ ALREADY FULLY COVERED
| File | Coverage |
|---|---|
factory-operations.md |
Lines 442-478: “Critical: Always Reassign After Save()” ✅ |
troubleshooting.md |
Lines 172-222: “Stale Data After Save” with mailing analogy ✅ |
blazor-integration.md |
Lines 566-636: Blazor-specific guidance ✅ |
No action needed - Documentation is current and comprehensive.
Status: ✅ BASIC COVERAGE EXISTS - OPTIONAL ENHANCEMENT
| File | Coverage |
|---|---|
troubleshooting.md |
Lines 124-142: “IsBusy is True and Blocking Save” ✅ |
blazor-integration.md |
Lines 447-463: “Preventing Premature Actions” ✅ |
blazor-integration.md |
Lines 551-564: “Why WaitForTasks() Before Save” ✅ |
What’s missing (optional):
async-tasks-design-rationale.mdRecommendation: Consider adding an advanced topic page for developers who want to understand the internals. Not critical for basic usage.
Status: ✅ ALREADY FULLY COVERED
| File | Coverage |
|---|---|
entity-list-base.md |
Lines 118-152: “Parent Assignment” section explains items get list’s parent ✅ |
aggregates.md |
Lines 124-136: Same concept explained ✅ |
No action needed - Documentation correctly explains that list items’ Parent points to the aggregate root, not the list.
_pages/reference/factory-operations.md:
public partial void MapFrom(...) to implemented method with LoadProperty callspublic partial void MapTo(...) to implemented method with property assignmentspublic partial void MapModifiedTo(...) as partial (still source-generated)CLAUDE.md commit tracking tables updated:
| Repository | Last Synced Commit | Date |
|————|——————-|——|
| Neatoo | 4c83d45 | 2025-12-30 |
| RemoteFactory | 9e62dda | 2025-12-30 |