Skip to content

Remove FSharp.Core compile-time dependency from Marten - #4232

Merged
jeremydmiller merged 1 commit into
masterfrom
fix/3981-remove-fsharp-dependency
Apr 6, 2026
Merged

jeremydmiller merged 1 commit into
masterfrom
fix/3981-remove-fsharp-dependency

Conversation

@jeremydmiller

Copy link
Copy Markdown
Member

Summary

  • Completely removes the FSharp.Core PackageReference from Marten.csproj
  • Replaces all direct FSharpOption<T> type references with reflection-based equivalents via new FSharpTypeHelper static class
  • F# support still works when FSharp.Core is present at runtime (loaded by F# consuming projects)
  • When FSharp.Core is NOT loaded, all F# checks gracefully return false/null — zero overhead for non-F# users

Closes #3981

What Changed

  • New FSharpTypeHelper.cs — lazy Type.GetType("Microsoft.FSharp.Core.FSharpOption\1, FSharp.Core")` resolution
  • StoreOptions.Identity.cs — RegisterFSharpOptionValueTypes() uses MakeFSharpOptionType() instead of typeof(FSharpOption<Guid>) etc.
  • StoreOptions.MemberFactory.cs — type checks use FSharpTypeHelper instead of direct type references
  • ConstantExpressionExtensions.cs — IsFSharpOptionType() replaces typeof(FSharpOption<>) comparison
  • FSharpOptionValueTypeMember.cs — deleted (empty class, replaced by direct ValueTypeMember<,>.MakeGenericType())
  • DocumentStore.cs — removed unused using Microsoft.FSharp.Control

Test plan

  • 42/42 F# integration tests pass (LINQ queries, record projections, discriminated union IDs, option types)
  • Compiled Marten.dll has zero FSharp.Core assembly references
  • Marten builds cleanly without FSharp.Core

🤖 Generated with Claude Code

Replace all direct FSharpOption<T> type references with reflection-based
equivalents via new FSharpTypeHelper static class. F# support still works
when FSharp.Core is present at runtime (loaded by F# consuming projects),
but Marten.dll no longer has a hard dependency on it.

Changes:
- New FSharpTypeHelper.cs: lazy reflection-based FSharpOption type resolution
- StoreOptions.Identity.cs: use FSharpTypeHelper for type construction
- StoreOptions.MemberFactory.cs: use FSharpTypeHelper for type checks
- ConstantExpressionExtensions.cs: use FSharpTypeHelper for option detection
- DocumentStore.cs: remove unused Microsoft.FSharp.Control import
- Delete FSharpOptionValueTypeMember.cs (replaced by ValueTypeMember<,>
  construction via MakeGenericType)
- Remove FSharp.Core PackageReference from Marten.csproj
- Add FSharp.Core to test projects that share Compile includes from
  Marten.Testing (previously inherited transitively via Marten)

66/66 F# tests pass (42 LINQ + 24 ValueType).
Compiled Marten.dll has zero FSharp.Core references.

Closes #3981

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@jeremydmiller
jeremydmiller force-pushed the fix/3981-remove-fsharp-dependency branch from 6b124d8 to a1388fb Compare April 6, 2026 19:05
@jeremydmiller
jeremydmiller merged commit dfeefc4 into master Apr 6, 2026
6 checks passed
@jeremydmiller
jeremydmiller deleted the fix/3981-remove-fsharp-dependency branch April 6, 2026 19:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Lower FSharp.Core dependency version from 9.0.100 to 8.0.100 or lower

1 participant