Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
618 commits
Select commit Hold shift + click to select a range
c63aedb
test(ef6.spatial): scaffold test project
May 7, 2026
515b4b8
feat(ef6.spatial): add DbSpatialConverter with Geography Point round-…
May 11, 2026
5286e72
test(ef6.spatial): broaden DbSpatialConverter coverage (Polygon, Z, S…
May 11, 2026
4df3f71
feat(ef6.spatial): add DbSpatialModelMetadataProvider
May 11, 2026
da48b6d
feat(ef6.spatial): add AddRestierSpatial DI extension
May 11, 2026
524b017
feat(efcore.spatial): scaffold Microsoft.Restier.EntityFrameworkCore.…
May 11, 2026
428331b
test(efcore.spatial): scaffold test project
May 11, 2026
30d9f98
feat(efcore.spatial): add NtsSpatialConverter for Microsoft.Spatial <…
May 11, 2026
3f4d672
feat(efcore.spatial): add NtsSpatialModelMetadataProvider with column…
May 11, 2026
b900853
feat(efcore.spatial): add AddRestierSpatial DI extension
May 11, 2026
7dc6083
feat(ef.shared): add SpatialModelConvention capture phase
May 11, 2026
b9d3782
feat(ef.shared): add SpatialModelConvention augment phase with naming…
May 11, 2026
bbdf002
test(efcore.spatial): assert [Spatial] validation against non-Spatial…
May 11, 2026
f3ed15a
feat(ef.shared): EFModelBuilder invokes SpatialModelConvention phases…
May 11, 2026
b5a37fe
feat(aspnetcore): EdmHelpers.GetPrimitiveTypeKind recognizes Microsof…
May 11, 2026
72624f7
feat(aspnetcore): RestierPayloadValueConverter dispatches spatial bra…
May 11, 2026
76cfceb
feat(ef6): EFChangeSetInitializer dispatches spatial writes to ISpati…
May 11, 2026
2cf875a
feat(efcore): EFChangeSetInitializer dispatches spatial writes to ISp…
May 11, 2026
555c9fd
test(library): wire spatial DI and add SqlServer NTS package referenc…
May 12, 2026
a866ffd
test(library): add SpatialPlace test entity (flavor-conditional)
May 12, 2026
466b544
test(integration): spatial round-trip end-to-end + regenerated EDM ba…
May 12, 2026
48802ef
refactor(ef6): delete obsolete GeographyConverter (replaced by DbSpat…
May 12, 2026
87f311a
feat(samples): add spatial HomeLocation to the Postgres sample
May 12, 2026
d2f2885
docs: add Spatial Types guide page
May 12, 2026
815a143
fix: unblock the EF6/EFCore integration test suite on .NET 5+
May 13, 2026
6b9c35b
test(ef6): wipe+reseed shared SQL Server DB once per process
May 13, 2026
7f16ccd
docs(plans): add EF6 spatial tests dotMorten shim plan
May 13, 2026
b4a9e6b
docs(plans): revise EF6 spatial plan after dotMorten falsification spike
May 14, 2026
18fd230
test(ef6-spatial): unskip round-trip tests via Microsoft.SqlServer.Ty…
May 14, 2026
1488374
test(ef6-spatial): comment why GeodeticNativeAvailable catches Exception
May 14, 2026
f1c7860
docs(spatial): explain EF6 + .NET 5+ Microsoft.SqlServer.Types requir…
May 14, 2026
19ca16c
docs(spatial): address code review on EF6/.NET 5+ section
May 14, 2026
016cf2d
fix(aspnetcore): propagate ODataOptions.TimeZone to filter binder (#704)
May 15, 2026
ffb4cba
docs(specs): design Spec B — server-side geo.* filter translation
May 15, 2026
54db99b
docs(specs): revise Spec B after first code review
May 15, 2026
541d82c
docs(specs): move Spec B binder registration to Microsoft.Restier.Asp…
May 15, 2026
46436e3
docs(plans): add Spec B implementation plan
May 15, 2026
1ae8835
feat(spatial-filter): add resource strings for filter-binder errors
May 15, 2026
852e985
fix(spatial-filter): reorder NoConverterForStorageType placeholders +…
May 15, 2026
3855e6c
feat(spatial-filter): add RestierSpatialFilterBinder skeleton
May 15, 2026
f2faabc
style(spatial-filter): match .editorconfig + namespace pattern in ske…
May 15, 2026
a8ab19b
feat(spatial-filter): wire RestierSpatialFilterBinder into AddRouteCo…
May 15, 2026
7487390
refactor(query-builder): accept optional IFilterBinder via ctor
May 15, 2026
14092fb
refactor(controller): pass DI-resolved IFilterBinder to RestierQueryB…
May 15, 2026
9d19a3a
style(controller): drop ?. on GetRouteServices for IFilterBinder lookup
May 15, 2026
eceb5f7
test(spatial-filter): add RouteLine LineString to SpatialPlace fixture
May 15, 2026
65d82a5
fix(library-fixture): pin RouteLine column type to geography
May 15, 2026
24d5098
test(spatial-filter): add .Spatial ProjectReferences to Tests.AspNetC…
May 15, 2026
db13a7d
feat(spatial-filter): translate geo.length to storage Length property…
May 15, 2026
aca5b4f
docs(spatial-filter): make RestierSpatialFilterBinder XML docs honest
May 15, 2026
3593c89
feat(spatial-filter): translate geo.distance via storage Distance method
May 15, 2026
f8d8475
fix(spatial-filter): wrap NotSupportedException from converter as ODa…
May 15, 2026
a7c9faa
feat(spatial-filter): translate geo.intersects via storage Intersects…
May 15, 2026
f39c29d
test(spatial-filter): assert unknown geo.* function names still reject
May 15, 2026
21cd8f6
docs(specs/plans): record parser-pre-validates-genus finding for Spec B
May 15, 2026
24e2126
test(spatial-filter): pin no-converters-registered diagnostic
May 15, 2026
029fbf8
docs(specs/plans): record non-EPSG-CRS path unreachable finding for S…
May 15, 2026
da9d54d
fix(spatial-filter): make geo.* LINQ output EF-Core-translatable
May 15, 2026
d180f5e
test(spatial-filter): add geo.* integration coverage with CLR-aware s…
May 15, 2026
ad142a2
docs(spatial): document server-side geo.* filter translation
May 15, 2026
c60b9f4
fix(spatial-filter): use lowered0.Type as both-literal hint for lowered1
May 15, 2026
3f694a0
test(query-builder): update FilterBinderResolutionTests ctor calls fo…
May 15, 2026
56fe9f6
docs: refresh spatial binder remarks + document TimeZone propagation …
May 15, 2026
4b880bd
docs(spec): allow [AllowAnonymous]/[Authorize] on RESTier API surfaces
May 15, 2026
248317a
docs(spec): address review on cache key + test harness auth wiring
May 15, 2026
905562e
docs(spec): rename remaining BuildWrappedEndpoint refs to DiscoverAtt…
May 15, 2026
450d83f
docs(plan): implementation plan for [AllowAnonymous]/[Authorize] on R…
May 15, 2026
a177f70
refactor(routing): RestierRouteMarker carries the registered API type
May 15, 2026
b4c3564
feat(routing): add ComputeTargetKey helper for authorization metadata…
May 18, 2026
8ae8b4a
feat(routing): add DiscoverAttributes; drop resource-property surface
May 18, 2026
55cbcd0
feat(routing): implement IEndpointSelectorPolicy.AppliesToEndpoints
May 18, 2026
1ad24e4
feat(routing): implement RestierAuthorizationMetadataPolicy.ApplyAsync
May 18, 2026
09b59d0
feat: wire authorization metadata policy through AddRestier; integrat…
May 18, 2026
8c6b231
docs: document [AllowAnonymous] / [Authorize] on RESTier API surfaces
May 18, 2026
4494045
docs+comments: fix [AllowAnonymous] precedence trap and operation ver…
May 18, 2026
d1ea9ec
docs(comment): RestierRouteMarker is route-services only, not endpoin…
May 18, 2026
08254d0
test(aspnetcore): refresh LibraryApi metadata baselines for SpatialPl…
May 18, 2026
6025c88
fix(spatial-filter): normalize geo.length PropertyInfo to base Geomet…
May 18, 2026
954f116
feat(core): add HasRecursiveExpand and AllowNoTracking hints to Query…
May 19, 2026
6be8719
feat(core): add IExpandCycleDetector interface
May 19, 2026
2fbd788
feat(core): add DefaultExpandCycleDetector
May 19, 2026
3c000de
test(core): exercise inheritance walk in expand cycle detector
May 19, 2026
02ce1cf
feat(core): register IExpandCycleDetector default in core DI
May 19, 2026
34a63de
feat(aspnetcore): opt HTTP reads into no-tracking + compute expand-cy…
May 19, 2026
3bfbf3f
docs(spec): design for RestierRouteOptions and opt-in conformance
May 19, 2026
bffbff1
feat(ef): introduce RestierEFTrackingBehavior and RestierEFOptions
May 19, 2026
096f5a5
feat(ef): register default RestierEFOptions in shared DI
May 19, 2026
5a51131
feat(ef6): add AddEF6ProviderServices overloads with RestierEFOptions
May 19, 2026
ec00fc5
feat(efcore): add AddEFCoreProviderServices overloads with RestierEFO…
May 19, 2026
c865c82
feat(ef): apply no-tracking by default in EFQueryExpressionSourcer
May 19, 2026
6d04486
docs(spec): address review findings on conformance-options design
May 19, 2026
61611e0
test(efcore): unit tests for RestierEFOptions tracking behavior
May 19, 2026
991ae95
test(ef6): unit tests for RestierEFOptions tracking behavior
May 19, 2026
83f8c46
docs(plan): implementation plan for RestierRouteOptions + conformance…
May 19, 2026
57a1db6
feat(core): add RestierConformanceOptions for opt-in spec strictness
May 19, 2026
ae03224
feat(core): add RestierRouteOptions bag for per-route configuration
May 19, 2026
24d855e
feat(aspnetcore)!: replace AddRestierRoute overloads with options-bag…
May 19, 2026
4a9dfac
docs(aspnetcore): correct stale summary on AddRestierRoute overload A
May 19, 2026
4f22bea
feat(breakdance): flow Action<RestierRouteOptions> through test helpers
May 19, 2026
ef1bb0d
feat(breakdance): thread configureOptions through GetTestableInjected…
May 19, 2026
4e6590e
sample: migrate AddRestierRoute calls to new options-bag form
May 19, 2026
e63f377
docs: tracking-behavior guide, release notes, api-reference regen
May 19, 2026
0b855b5
docs: drop hedge in performance.mdx; add the implementation plan
May 19, 2026
8031666
feat(versioning)!: switch AddVersion to Action<RestierRouteOptions>
May 19, 2026
1c2e00e
feat(controller): opt-in 404 for collection nav from missing parent
May 19, 2026
f8b9c46
test: cover opt-in collection-nav 404 conformance toggle (#735)
May 19, 2026
ee2d57a
test(rename): drop misleading 'Empty' from existing-parent strict test
May 19, 2026
764ac70
docs: add conformance-options guide and RestierRouteOptions migration…
May 19, 2026
3cc2445
docs: migrate AddRestierRoute samples to options-bag form
May 19, 2026
a8b7e13
fix(aspnetcore)+test: opt bound-function GET binding source into no-t…
May 19, 2026
405b9f0
test(ef): direct sourcer tests covering EF6 recursive-expand fallback
May 19, 2026
5ca32c4
fix: address final review findings on conformance-options branch
May 19, 2026
10d5d7a
fix(test-infra): force-close pooled connections before EF6 SeedDataba…
May 19, 2026
7a928b0
test(aspnetcore): opt BoundFunctions tests into TrackAll for intercep…
May 19, 2026
5ce1cc8
fix(controller): apply StrictMissingParentForCollections to $count too
May 19, 2026
4e5893c
docs: document $count coverage of StrictMissingParentForCollections
May 19, 2026
1fbd9ea
test(ef6): HTTP-level no-tracking tests via Breakdance
May 19, 2026
7f45d8d
Merge branch 'feature/vnext' into worktree-issue-735-empty-set
May 19, 2026
8f51224
fix(ef6): null-safe rewrite of in-memory SelectExpand projection
May 19, 2026
777ea3b
test(deep-insert): configure MaxDepth via RestierRouteOptions bag
May 19, 2026
da37f5d
docs(spec): design for keyless EF views as read-only RESTier resources
May 19, 2026
a94d2b9
docs(spec): revise keyless-views design after code-review pushback
May 19, 2026
00906d9
docs(spec): add documentation deliverable + dedicated follow-ups section
May 19, 2026
260bbfd
docs(plan): implementation plan for keyless EF views (#741)
May 19, 2026
ac67ac6
docs(plan+spec): four corrections after second review round
May 19, 2026
9ca7444
docs(plan+spec): three corrections after third review round
May 19, 2026
f4029a2
docs(plan): fix Ensure helper method name (NotNullOrWhiteSpace, not N…
May 19, 2026
29a9331
feat(core): add KeylessViewEntry DTO for keyless-view dispatch
May 19, 2026
85928ba
feat(core): add KeylessViewRegistry with duplicate-name guard
May 19, 2026
4794a55
feat(aspnetcore): bridge KeylessViewRegistry across model-build SP
May 19, 2026
2a4f35a
feat(ef): inject KeylessViewRegistry into shared EFModelBuilder
May 19, 2026
57ee829
feat(ef): demote keyless types to ComplexType + FunctionImport (EFCore)
May 19, 2026
cad37fd
test(efcore): verify keyless views become ComplexType + FunctionImport
May 19, 2026
a9b7b37
feat(aspnetcore): dispatch keyless-view function imports via registry
May 19, 2026
b1f0e19
feat(aspnetcore): return 405 for DELETE/PUT/PATCH on function imports
May 19, 2026
2e5f7f1
refactor(tests): move LibraryWithViews fixtures to shared
May 19, 2026
e084f53
test(infra): seed LibraryWithViewsContext via SeedDatabase helper (EF…
May 19, 2026
8c3c84c
feat(ef6): emit source factories + normalise empty key lists
May 19, 2026
6b27750
test(efcore): end-to-end coverage for keyless-view function imports
May 19, 2026
03c7679
refactor(keyless-views): reuse LibraryContext instead of separate fix…
May 19, 2026
6934b55
refactor(keyless-views): scope to EFCore only; remove EF6 path
May 19, 2026
84f5a0b
docs(server): add Keyless Views guide + cross-links + release-notes stub
May 19, 2026
7776e5d
fix(keyless-views): fire operation-filter pipeline + pin naming behav…
May 19, 2026
57968eb
fix(keyless-views): initialise ParameterValues before filter pipeline
May 19, 2026
83ca203
docs(spec): design for magical operations (issue #750)
May 19, 2026
ae7d28b
docs(spec): revise magical-operations design after review
May 19, 2026
cb4efe6
docs(spec): make parameter-value lookup presence-aware
May 20, 2026
dcb0cf1
docs(plan): implementation plan for magical operations (issue #750)
May 20, 2026
e6e8180
feat(core): add RestierValidationOptions POCO for route-level query l…
May 20, 2026
749bac7
test(core): cover post-construction property reassignment in RestierV…
May 20, 2026
0074cb8
feat(core): expose Validation bag on RestierRouteOptions
May 20, 2026
9c21e5b
feat(aspnetcore): add RestierValidationOptionsResolver (Resolve + Build)
May 20, 2026
15c162b
test(aspnetcore): align folder name with namespace for resolver tests
May 20, 2026
03e3581
style(aspnetcore): file-scoped namespace and consistent assignment in…
May 20, 2026
bd3c160
feat(aspnetcore)!: RestierRouteOptions.Validation is the only query v…
May 20, 2026
b2baf01
style(aspnetcore): drop double blank line after ODataQuerySettings re…
May 20, 2026
151d1ed
test(aspnetcore): HTTP-level coverage of RestierRouteOptions.Validati…
May 20, 2026
2290bbb
docs(guides): add Query Validation Options guide for the bag-only cha…
May 20, 2026
6300583
docs(core): fix stale QuerySettings reference in RestierValidationOpt…
May 20, 2026
97def03
docs: cross-reference validation-options from conformance-options table
May 20, 2026
51b734f
docs(guides): sweep legacy ODataValidationSettings examples to the ba…
May 20, 2026
82d0682
docs(release-notes): announce RestierRouteOptions.Validation bag-only…
May 20, 2026
13056bf
docs: cross-reference validation-options from conformance-options table
May 20, 2026
5d67698
sample: align Postgres + NorthwindVersioned with Northwind's single-s…
May 20, 2026
a63cbdf
feat(operations): add [Optional] parameter marker
May 20, 2026
249d168
feat(operations): add OperationParameterClassifier helper
May 20, 2026
8315134
fix(openapi): inherit global SetMaxTop in Swagger/NSwag TopExample
May 20, 2026
76c7679
docs(api-reference): regenerate docs.json for public RestierValidatio…
May 20, 2026
16ce21a
Merge worktree-validation-options-bag-issue-751 — RestierRouteOptions…
May 20, 2026
af3df93
docs(plan): keyless-view follow-ups A/B/D implementation plan
May 20, 2026
7432699
feat(edm): EdmHelpers.GetTypeReference accepts explicit nullable
May 20, 2026
d13e620
feat(core): add GetFunctionImportMethodName convention helper
May 20, 2026
c8effc0
docs(plan): correct convention name to OnFilter<View> (no gerund)
May 20, 2026
d24a78c
refactor(core): hoist method-name + container-name out of AppendOnFil…
May 20, 2026
10e0096
feat(operations)!: presence-aware parameter delegate
May 20, 2026
9fb9d99
feat(operations): dedupe [Operation] registrations by name
May 20, 2026
94c3653
feat(core): fire OnFilter convention for function-import references
May 20, 2026
8952818
feat(aspnetcore): resolve function-import names through RestierModelM…
May 20, 2026
060ca6a
feat(operations): emit optional + nullable parameter shapes
May 20, 2026
2d96a98
feat(ef): chained IQueryExpressionSourcer for keyless-view function i…
May 20, 2026
1a0d08f
feat(operations): emit [Obsolete] and parameter [Description]
May 20, 2026
3198cda
feat(aspnetcore): route keyless-view GET into the query pipeline
May 20, 2026
d84032b
refactor(aspnetcore): remove unreachable keyless-view branch from exe…
May 20, 2026
d613821
feat(operations): auto-register types referenced by [Operation] methods
May 20, 2026
da54aa6
test(keyless-views): flip OnFilter pin + add authorizer end-to-end test
May 20, 2026
e30f0c8
feat(di): register OperationTypeRegistrationModelBuilder in chain
May 20, 2026
8d95881
test(keyless-views): end-to-end NoTracking assertion for keyless-view…
May 20, 2026
9bbb4df
docs(server): keyless views participate in the query pipeline
May 20, 2026
b8f88fc
test(nswag): verify keyless-view function import surfaces in OpenAPI doc
May 20, 2026
a5c3afc
test(operations): HTTP integration coverage for magical operations
May 20, 2026
835f1bb
test(swagger): verify keyless-view function import surfaces in OpenAP…
May 20, 2026
5a46735
samples(postgres): demonstrate a keyless view (UsersByType)
May 20, 2026
5d7fbda
docs(operations): document magical operations and breaking change
May 20, 2026
f666687
Merge worktree-magical-operations-issue-750 — magical operations (iss…
May 21, 2026
9bdcb5a
refactor(aspnetcore): drop unused KeylessViewRegistry ctor param from…
May 21, 2026
644728a
refactor(core): add Type-keyed GetQueryableSource and use from Restie…
May 21, 2026
851bb3d
fix(operations): warn+require [Optional] on non-nullable value types
May 21, 2026
839508d
Merge worktree-keyless-views-followups-abd — keyless EF Views (Follow…
May 21, 2026
fc21344
docs(release-notes): merge magical-operations into single 2.0.0-beta …
May 21, 2026
fa183f8
test(aspnetcore): regression coverage for $batch + $ContentId from is…
May 21, 2026
f9ac859
fix(aspnetcore): isolate ChangeSetDependencyResolver mapping from fra…
May 21, 2026
70e26c4
feat(tests): add scheduled tasks lock file and update RestierOperatio…
May 21, 2026
24b1c4e
fix(aspnetcore): emit typed EDM primitive references for op parameter…
May 21, 2026
9483226
fix(core): guard TypeAs filter cast against uncached lambda parameter…
May 21, 2026
d835b4a
Merge remote-tracking branch 'origin/main' into feature/vnext
May 21, 2026
b6f568c
ci(pipelines): retarget root RESTier.slnx and refresh pack list
May 21, 2026
8885df5
ci(pipelines): bump CI version to 2.0.0 and run tests
May 21, 2026
bb89210
ci(tests): install net8/net9 runtimes and wire LocalDB for CI
May 21, 2026
f6f1fa8
ci(tests): install net8/net9 SDKs instead of runtimes
May 21, 2026
9238742
ci(tests): pre-start LocalDB before dotnet test
May 21, 2026
e6a848d
test: add MSTest 3.x packages alongside xUnit for migration
May 21, 2026
7e7fe1b
test(aspnetcore): restore Sea-of-Rust orphan after PublishNewBook action
May 21, 2026
c6c1b1b
test(shared): swap Xunit.TestContext for MSTest TestContext in Restie…
May 21, 2026
8541e16
test(efcore.spatial): convert from xUnit to MSTest
May 21, 2026
8f425e6
test(efcore.spatial): reorder using directives alphabetically
May 21, 2026
f7b0c5c
test(ef.spatial): convert from xUnit to MSTest
May 21, 2026
88f8097
test(ef): convert from xUnit to MSTest
May 21, 2026
c19e51d
test(efcore): convert from xUnit to MSTest
May 21, 2026
3cc847a
test(core): convert from xUnit to MSTest
May 21, 2026
2e18f4e
test(aspnetcore.swagger): convert from xUnit to MSTest
May 21, 2026
fdd46db
test(aspnetcore.nswag): convert from xUnit to MSTest
May 21, 2026
9fda62b
test(aspnetcore.versioning): convert from xUnit to MSTest
May 21, 2026
7958dcd
test(aspnetcore): convert special-pattern files (collections, ITestOu…
May 21, 2026
13b1a55
test(aspnetcore): convert remaining files from xUnit to MSTest
May 21, 2026
7939fa2
test: remove xUnit packages now that all projects use MSTest
May 21, 2026
540287e
ci(coverage): collect XPlat Code Coverage, merge with ReportGenerator…
May 21, 2026
ba2c5b6
docs(claude.md): note MSTest as the test framework
May 21, 2026
4252656
docs(contributing): MSTest replaces xUnit
May 21, 2026
084707d
docs(contribution-guidelines): MSTest replaces xUnit
May 21, 2026
ceed42c
docs(testing): MSTest examples replace xUnit examples
May 21, 2026
9350689
docs(guides): MSTest examples replace xUnit in authorization and inte…
May 21, 2026
b54fb08
test(ef.spatial): restore conditional skip on geodesic round-trip tests
May 21, 2026
6445bc4
test(aspnetcore): restore conditional skip on CLR-gated spatial filte…
May 21, 2026
a6ba1ab
test(efcore): replace IDisposable with [TestCleanup] in EFQuerySource…
May 21, 2026
d4fa682
test(ef): dispose TrackingTestContext via [TestCleanup] in EFQuerySou…
May 21, 2026
f46e65a
test: serialise LocalDB-touching test assemblies via cross-process se…
May 21, 2026
25efb90
test: drop AssemblyHooks from NSwag/Swagger/Versioning — no LocalDB f…
May 21, 2026
d98204b
test: add SharedLocalDbLock re-entrancy guard + extend lock to EFCore…
May 21, 2026
4c92651
docs(plan): correct Task 6 verification — 3 AssemblyHooks not 5
May 21, 2026
5490bb7
docs(plan): align file map and assembly table with actual Task 5 outcome
May 21, 2026
a65a50c
Merge branch 'worktree-xunit-to-mstest' into feature/vnext
May 21, 2026
16a50f9
test: migrate from xUnit to MSTest across all test projects
May 21, 2026
7ce64c5
ci(coverage): drop redundant --results-directory (causes duplicate arg)
May 21, 2026
163bfff
ci(coverage): broaden ReportGenerator glob + log discovered files
May 21, 2026
6f75219
docs(readme): refresh for 2.0 (Beta) — modern stack, components, what…
May 21, 2026
94c4bc2
feat(batching): auto-register ODataBatchHttpContextFixerMiddleware
Jun 18, 2026
d0adac6
fix(query): make single-navigation OnFilter EF Core-translatable and …
Aug 5, 2026
d92b2ba
fix(deps): pin Microsoft.OpenApi to patched 3.5.4+ to clear restore a…
Aug 5, 2026
f5e1256
fix(batching): resolve $ContentId before AspNetCore.OData 9.5.0 parse…
Aug 5, 2026
20dec26
fix(batching): make batch request-line rewrite CRLF-safe (Windows CI)
Aug 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Binary file added .DS_Store
Binary file not shown.
12 changes: 0 additions & 12 deletions .claude/settings.local.json

This file was deleted.

File renamed without changes.
2 changes: 1 addition & 1 deletion .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ These are the recommended steps to create a pull request:<br />
17. Microsoft OData team will merge the pull request into upstream

### Test specification
All tests need to be written with xUnit. Here are some rules to follow when you are organizing the test code:
All tests need to be written with MSTest. Here are some rules to follow when you are organizing the test code:
- **Project name correspondence** (`X -> X.Tests`). For instance, all the test code of the `Microsoft.Restier.Core` project should be placed in the `Microsoft.Restier.Core.Tests` project. Path and file name correspondence. (`X/Y/Z/A.cs -> X.Tests/Y/Z/ATests.cs`). For example, the test code of the `ConventionBasedApiModelBuilder` class (in the `Microsoft.Restier.Core/Convention/ConventionBasedApiModelBuilder.cs` file) should be placed in the `Microsoft.Restier.Core.Tests/Convention/ConventionBasedApiModelBuilderTests.cs` file.
- **Namespace correspondence** (`X.Tests/Y/Z -> X.Tests.Y.Z`). The namespace of the file should strictly follow the path. For example, the namespace of the `ConventionBasedApiModelBuilderTests.cs` file should be `Microsoft.Restier.Core.Tests.Convention`.
- **Utility classes**. The file for a utility class can be placed at the same level of its user or a shared level that is visible to all its users. But the file name must **NOT** be ended with `Tests` to avoid any confusion.
Expand Down
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ bld/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

#claude generated files.
.claude/

# Visual Studio 2017 auto generated files
Generated\ Files/

Expand Down Expand Up @@ -329,3 +332,9 @@ ASALocalRun/
# MFractors (Xamarin productivity tool) working folder
.mfractor/
/docs/msdocs/.vscode
/docs/msdocs/_site/

# DotNetDocs SDK regenerates this on build
src/Microsoft.Restier.Docs/api-reference/
# DotNetDocs SDK writes this as a Debug-build debug dump (not config)
src/Microsoft.Restier.Docs/assembly-list.txt
81 changes: 78 additions & 3 deletions .pipelines/RESTier-CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ stages:

# --- Set Build Name ---
- powershell: |
$buildName = "1.2.0-CI-$(Get-Date -Format 'yyyyMMdd-HHmmss')"
$buildName = "2.0.0-CI-$(Get-Date -Format 'yyyyMMdd-HHmmss')"
Write-Host "##vso[build.updatebuildnumber]$buildName"
displayName: Set Build Name

Expand All @@ -35,12 +35,29 @@ stages:
packageType: sdk
version: 10.0.100

# net8/net9 SDKs for multi-targeted test execution. UseDotNet@2 above pins
# dotnet to the tool cache, hiding the agent's pre-installed runtimes; and
# packageType: runtime only installs Microsoft.NETCore.App, not the
# Microsoft.AspNetCore.App shared framework the tests need, so we install
# SDKs (which bundle both runtimes) instead.
- task: UseDotNet@2
displayName: Use .NET SDK 9.x
inputs:
packageType: sdk
version: 9.x

- task: UseDotNet@2
displayName: Use .NET SDK 8.x
inputs:
packageType: sdk
version: 8.x

# --- Restore & Build ---
- task: DotNetCoreCLI@2
displayName: dotnet restore
inputs:
command: restore
projects: 'src/RESTier.slnx'
projects: 'RESTier.slnx'
feedsToUse: config
nugetConfigPath: 'NuGet.Config'

Expand All @@ -55,15 +72,73 @@ stages:
--configuration $(BuildConfiguration)
--no-restore

# --- Test ---
# Pre-start LocalDB so the first test's connection doesn't time out waiting
# on the ~60s auto-start (observed previously failing the net8 batch).
- powershell: |
sqllocaldb start MSSQLLocalDB
sqllocaldb info MSSQLLocalDB
displayName: Start LocalDB

- task: DotNetCoreCLI@2
displayName: dotnet test
env:
ConnectionStrings__LibraryContext: 'Server=(localdb)\MSSQLLocalDB;Initial Catalog=LibraryContext;Trusted_Connection=true;TrustServerCertificate=true'
ConnectionStrings__MarvelContext: 'Server=(localdb)\MSSQLLocalDB;Initial Catalog=MarvelContext;Trusted_Connection=true;TrustServerCertificate=true'
inputs:
command: test
projects: 'test/**/*.csproj'
arguments: >
--configuration $(BuildConfiguration)
--no-build
--collect:"XPlat Code Coverage"
publishTestResults: true

# --- Coverage report ---
- task: DotNetCoreCLI@2
displayName: Install ReportGenerator
inputs:
command: custom
custom: tool
arguments: install dotnet-reportgenerator-globaltool --tool-path $(Agent.TempDirectory)/tools

- powershell: |
Write-Host "=== Coverage files discovered under Agent.TempDirectory ==="
Get-ChildItem -Path "$(Agent.TempDirectory)" -Filter coverage.cobertura.xml -Recurse -ErrorAction SilentlyContinue |
ForEach-Object { Write-Host $_.FullName }
Write-Host "==========================================================="
& "$(Agent.TempDirectory)/tools/reportgenerator.exe" `
"-reports:$(Agent.TempDirectory)/**/coverage.cobertura.xml" `
"-targetdir:$(Build.ArtifactStagingDirectory)/CoverageReport" `
"-reporttypes:Cobertura;HtmlInline_AzurePipelines;TextSummary"
Get-Content "$(Build.ArtifactStagingDirectory)/CoverageReport/Summary.txt"
displayName: Generate Coverage Report

- task: PublishCodeCoverageResults@2
displayName: Publish Code Coverage
inputs:
summaryFileLocation: '$(Build.ArtifactStagingDirectory)/CoverageReport/Cobertura.xml'
pathToSources: '$(Build.SourcesDirectory)'

- task: PublishPipelineArtifact@1
displayName: 'Publish Artifact: CoverageReport'
inputs:
targetPath: '$(Build.ArtifactStagingDirectory)/CoverageReport'
artifact: CoverageReport
condition: succeededOrFailed()

# --- Pack ---
- powershell: |
$projects = @(
"src/Microsoft.Restier.Core/Microsoft.Restier.Core.csproj",
"src/Microsoft.Restier.EntityFramework/Microsoft.Restier.EntityFramework.csproj",
"src/Microsoft.Restier.EntityFramework.Spatial/Microsoft.Restier.EntityFramework.Spatial.csproj",
"src/Microsoft.Restier.EntityFrameworkCore/Microsoft.Restier.EntityFrameworkCore.csproj",
"src/Microsoft.Restier.AspNet/Microsoft.Restier.AspNet.csproj",
"src/Microsoft.Restier.EntityFrameworkCore.Spatial/Microsoft.Restier.EntityFrameworkCore.Spatial.csproj",
"src/Microsoft.Restier.AspNetCore/Microsoft.Restier.AspNetCore.csproj",
"src/Microsoft.Restier.AspNetCore.Swagger/Microsoft.Restier.AspNetCore.Swagger.csproj",
"src/Microsoft.Restier.AspNetCore.NSwag/Microsoft.Restier.AspNetCore.NSwag.csproj",
"src/Microsoft.Restier.AspNetCore.Versioning/Microsoft.Restier.AspNetCore.Versioning.csproj",
"src/Microsoft.Restier.Breakdance/Microsoft.Restier.Breakdance.csproj"
)
foreach ($proj in $projects) {
Expand Down
119 changes: 119 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Project Overview

Microsoft RESTier is an OData V4 API development framework for building standardized RESTful services on .NET. It is the spiritual successor to WCF Data Services, providing convention-based query interception and data manipulation over Entity Framework.

## Build & Test Commands

```bash
# Build entire solution
dotnet build RESTier.slnx

# Run all tests
dotnet test RESTier.slnx

# Run a single test project
dotnet test test/Microsoft.Restier.Tests.Core/Microsoft.Restier.Tests.Core.csproj

# Run a specific test by name
dotnet test --filter "FullyQualifiedName~TestMethodName"

# Build a single project
dotnet build src/Microsoft.Restier.Core/Microsoft.Restier.Core.csproj
```

## Architecture

### Core Pipeline (Chain of Responsibility)

RESTier's central pattern is a **chain of responsibility** pipeline for both queries and submissions. Services implement `IChainedService<TService>` with an `Inner` property, composed via `IChainOfResponsibilityFactory`.

**Query pipeline** (`Microsoft.Restier.Core.Query`):
`IQueryExpressionSourcer` -> `IQueryExpressionAuthorizer` -> `IQueryExpressionExpander` -> `IQueryExpressionProcessor` -> `IQueryExecutor`
Orchestrated by `DefaultQueryHandler`.

**Submit pipeline** (`Microsoft.Restier.Core.Submit`):
`IChangeSetInitializer` -> `IChangeSetItemFilter` -> `IChangeSetItemAuthorizer` -> `IChangeSetItemValidator` -> `ISubmitExecutor`
Orchestrated by `DefaultSubmitHandler`.

### Convention-Based Interception

RESTier discovers interceptor methods by naming convention on `ApiBase` subclasses:
- `OnFiltering{EntitySet}()` / `OnInserting{Entity}()` / `OnValidating{Entity}()` etc.
- Implemented via `ConventionBasedQueryExpressionProcessor`, `ConventionBasedChangeSetItemFilter`, `ConventionBasedChangeSetItemValidator`

### Key Base Classes

- `ApiBase` - Base class for all RESTier APIs; subclass to define your API surface
- `EntityFrameworkApi<TContext>` - EF-specific base providing DbContext integration
- `RestierController : ODataController` - Handles OData HTTP requests in ASP.NET Core

### Project Layout

| Directory | Purpose |
|-----------|---------|
| `src/Microsoft.Restier.Core` | Core abstractions, pipelines, conventions, DI |
| `src/Microsoft.Restier.AspNetCore` | ASP.NET Core integration, routing, controller |
| `src/Microsoft.Restier.EntityFramework` | Entity Framework 6.x support |
| `src/Microsoft.Restier.EntityFrameworkCore` | Entity Framework Core support |
| `src/Microsoft.Restier.EntityFramework.Shared` | Shared EF code (shared project, not NuGet) |
| `src/Microsoft.Restier.Breakdance` | In-memory testing framework |
| `src/Microsoft.Restier.AspNetCore.Swagger` | Swagger/OpenAPI generation |

### Dependency Injection

Uses `Microsoft.Extensions.DependencyInjection` with per-route service containers. Service registration extensions are in `Microsoft.Restier.Core.DependencyInjection` and `Microsoft.Restier.AspNetCore.Extensions`.

## Code Conventions

- **Targets:** .NET 8.0, .NET 9.0, and .NET Framework 4.8
- **Warnings as errors** enabled globally
- **Implicit usings disabled** - all `using` directives must be explicit
- **Nullable reference types disabled**
- **Strong name signing** with `restier.snk`
- **Allman brace style**, prefer `var`, prefer curly braces even for single-line blocks
- **InternalsVisibleTo** is auto-configured from source to matching test project

## Test Conventions

- **Framework:** MSTest 3.x, FluentAssertions (AwesomeAssertions), NSubstitute
- **Project naming:** `X` -> `X.Tests` (e.g., `Microsoft.Restier.Core` -> `Microsoft.Restier.Tests.Core`)
- **File naming:** `X/Y/Z/A.cs` -> `X.Tests/Y/Z/ATests.cs`
- **Namespace:** must match folder path (e.g., `Microsoft.Restier.Tests.Core.Convention`)
- **Integration/scenario tests** go in `X.Tests/IntegrationTests` or `X.Tests/ScenarioTests`

## Documentation

Documentation lives in `src/Microsoft.Restier.Docs/` and is built with the **DotNetDocs SDK** (`<Project Sdk="DotNetDocs.Sdk/1.2.0">`), which generates Mintlify-flavored MDX.

```bash
# Build the docs project (regenerates api-reference/ and docs.json)
dotnet build src/Microsoft.Restier.Docs/Microsoft.Restier.Docs.docsproj
```

The docs project is part of `RESTier.slnx`, so a full solution build also builds the docs:

```bash
dotnet build RESTier.slnx
```

**Authoring conventions:**
- Hand-written content lives under `guides/`, `release-notes/`, and the project root (`index.mdx`, `quickstart.mdx`, `contribution-guidelines.mdx`, `why-restier.mdx`).
- API reference under `api-reference/` is auto-generated from XML doc comments (six assemblies at TFM `net9.0`) and gitignored — do NOT hand-edit it.
- Pages use Mintlify components: `<Info>`, `<Note>`, `<Tip>`, `<Warning>`, `<Steps>`, `<CodeGroup>`, `<Tabs>`, `<CardGroup>`. See existing pages for examples.

**Navigation source of truth:** the `<MintlifyTemplate>` block in `Microsoft.Restier.Docs.docsproj`. The SDK regenerates `docs.json` from this template on every build, so commit `docs.json` alongside any nav-affecting change but do not hand-edit it.

**Build-ordering note:** the docsproj has an explicit `BuildSourceProjectsForDocs` target that calls `<MSBuild>` on each documented source project for `net8.0` before doc generation runs. The DotNetDocs SDK resolves assembly paths against `bin/Debug/net8.0/`, and `<ProjectReference>` items alone don't reliably trigger a full Build of the multi-targeted source projects from this NoTargets-style docsproj.

`assembly-list.txt` under the docs project is a Debug-build debug dump written by the SDK (not configuration). It is gitignored.

## Key Dependencies

- Microsoft.OData.Core / Microsoft.OData.Edm (8.x)
- Microsoft.OData.ModelBuilder (2.x)
- Microsoft.AspNetCore.OData (9.x)
- EntityFramework 6.5.x / EntityFrameworkCore 8.x-10.x
Loading