AstraFlow.Mapper.EntityFrameworkCore
1.6.2
dotnet add package AstraFlow.Mapper.EntityFrameworkCore --version 1.6.2
NuGet\Install-Package AstraFlow.Mapper.EntityFrameworkCore -Version 1.6.2
<PackageReference Include="AstraFlow.Mapper.EntityFrameworkCore" Version="1.6.2" />
<PackageVersion Include="AstraFlow.Mapper.EntityFrameworkCore" Version="1.6.2" />
<PackageReference Include="AstraFlow.Mapper.EntityFrameworkCore" />
paket add AstraFlow.Mapper.EntityFrameworkCore --version 1.6.2
#r "nuget: AstraFlow.Mapper.EntityFrameworkCore, 1.6.2"
#:package AstraFlow.Mapper.EntityFrameworkCore@1.6.2
#addin nuget:?package=AstraFlow.Mapper.EntityFrameworkCore&version=1.6.2
#tool nuget:?package=AstraFlow.Mapper.EntityFrameworkCore&version=1.6.2
AstraFlow
![]()
AstraFlow is a MIT-licensed .NET package family for explicit CQRS dispatch and source-auditable object mapping.
It was built to keep production applications free from runtime license checks, hidden mapping behavior, and framework lock-in. The v1 design is deliberately small: secure defaults, clear errors, explicit extension points, and package-quality diagnostics before optional convention layers are added.
Release And Repository Links
NuGet shows package history under the Release Notes tab. GitHub shows only selected community files as repository tabs, so the README is the main public hub for everything else.
| Link | What It Shows |
|---|---|
| Release Notes / Changelog | Full release-by-release package history. |
| GitHub Releases | Tagged releases and downloadable source archives. |
| Security Policy | Supported versions and vulnerability reporting. |
| Contributing | Local development, tests, and contribution rules. |
| Code of Conduct | Expected community behavior. |
| Support | Where to ask usage questions or report package issues. |
| Buy Me a Coffee | Optional support for ongoing maintenance. |
| Roadmap | Planned mediator, mapper, testing, analyzer, generator, and ecosystem work. |
| Publishing Guide | Release and NuGet publishing process. |
| MIT License | Package license. |
Packages
| Package | Purpose |
|---|---|
AstraFlow.Contracts |
Shared mediator contracts for requests, notifications, streams, senders, publishers, processors, and exception flow. |
AstraFlow.Mediator |
Request/response dispatch, void commands, stream requests, notification publishing, pipeline behaviors, processors, exception flow, handler scanning, duplicate handler detection, and optional handler coverage validation. |
AstraFlow.Mapper |
Explicit object mapping rules, declared mapping catalogs, startup validation, collection mapping, named projection registry, projection validation, and secure ID mapping abstractions. |
AstraFlow.Mapper.Conventions |
Optional convention mapping with exact pair registration, profiles, strict mapping plans, flattening, explicit reverse mapping, inheritance, polymorphic dispatch, custom paths, resolvers, value transformers, hooks, and sensitive-field safeguards. |
AstraFlow.Mapper.EntityFrameworkCore |
Optional EF Core projection translation validation helpers for registered AstraFlow projections. |
AstraFlow.Diagnostics |
Framework-neutral diagnostics reports for AstraFlow registrations, findings, JSON output, Markdown output, and health-check-ready summaries. |
AstraFlow.Testing |
Framework-neutral test helpers for fake mediator flows, handler harnesses, mapper/projection assertions, diagnostics assertions, and test secure IDs. |
AstraFlow |
Convenience package referencing both mediator and mapper with one registration method. |
Documentation Map
| Document | Read When |
|---|---|
| Getting Started | You want the shortest path from install to working mediator and mapper usage. |
| Package Selection | You want to choose the smallest package set for an app, library, test project, or EF Core project. |
| Compatibility | You want current target framework support and target-expansion rules. |
| API Reference | You need every public type, method, option, and expected behavior in one table-driven reference. |
| Architecture | You want to understand the package design, runtime flow, dependency boundaries, and non-goals. |
| Mediator Guide | You are using requests, handlers, notifications, or pipeline behaviors. |
| Mediator Scenarios | You want expected behavior for success cases, missing handlers, duplicate handlers, ambiguous requests, pipeline order, and notification failures. |
| Mapper Guide | You are writing mapping rules, projections, validation, or secure ID mapping. |
| Convention Mapping | You want opt-in convention mapping with visible mapping plans and sensitive-field safeguards. |
| Mapper Scenarios | You want expected behavior for object mapping, nulls, collections, validation failures, projections, and secure IDs. |
| Projection Guide | You are registering, naming, validating, or resolving explicit projections. |
| Projection Scenarios | You want expected behavior for duplicate, missing, named, risky, and strict projection cases. |
| EF Core Guide | You want optional EF Core projection translation checks. |
| Diagnostics Guide | You want JSON or Markdown reports of handlers, behaviors, mappings, projections, and diagnostics findings. |
| Testing Guide | You want fake sender/publisher/mediator helpers, handler harnesses, and assertion helpers for tests. |
| Troubleshooting | You hit an exception and want the likely cause and fix. |
| Community Release Guide | You are preparing the repo push, tag, package verification, and community-facing release notes. |
| Roadmap | You want the completed v1.2 projection safety scope and the future testing, mediator-parity, mapping-parity, analyzer, generator, and ecosystem roadmap. |
| Future Ideas Bank | You want the broader candidate backlog for future features, integrations, platform tooling, and research ideas. |
| Changelog | You want the release-by-release history shown in GitHub and linked from the NuGet README. |
| Publishing | You are preparing or verifying a NuGet release. |
Target Framework
Since 1.4.0, AstraFlow.Contracts, AstraFlow, AstraFlow.Mediator, AstraFlow.Mapper, AstraFlow.Diagnostics, and AstraFlow.Testing ship netstandard2.0, net8.0, net9.0, and net10.0 assets. Since 1.5.0, AstraFlow.Mapper.Conventions ships the same non-EF targets. AstraFlow.Mapper.EntityFrameworkCore remains net10.0 because it follows the EF Core 10 package line.
Public API At A Glance
Registration
| API | Package | Use It For | Expected Result |
|---|---|---|---|
services.AddAstraFlowMediator(params Type[] assemblyMarkerTypes) |
AstraFlow.Mediator |
Register mediator services and scan marker assemblies without request coverage validation. | IMediator, ISender, IPublisher, request handlers, and notification handlers are available from DI. |
services.AddAstraFlowMediator(bool validateRequestCoverage, params Type[] assemblyMarkerTypes) |
AstraFlow.Mediator |
Register mediator services and optionally fail startup when scanned requests have no handler or ambiguous contracts. | Same registration as above, with extra validation when enabled. |
services.AddAstraFlowMediator(builder => ..., params Type[] assemblyMarkerTypes) |
AstraFlow.Mediator |
Register mediator services and add explicit behaviors, processors, stream behaviors, and exception-flow components. | Core handlers are scanned and cross-cutting components are registered in a readable place. |
services.AddAstraFlowMapper(params Type[] assemblyMarkerTypes) |
AstraFlow.Mapper |
Register mapper services and scan marker assemblies for mapping rules and projections. | IMapper, IObjectMappingValidator, IProjectionRegistry, IProjectionValidator, SecureIdMapper, and startup validation are registered. |
services.AddAstraFlowMapper(IEnumerable<Type>, Action<MappingOptions>?) |
AstraFlow.Mapper |
Register mapper services with explicit mapper/projection validation options. | Mapping and projection validation behavior is configured without adding new overloads for every option. |
services.AddAstraFlowConventionMapping(...) |
AstraFlow.Mapper.Conventions |
Register exact opt-in convention mapping pairs, profiles, and strict mapping-plan validation. | Convention mapping rules and IMappingPlanProvider are registered without changing explicit mapper defaults. |
services.AddAstraFlowDiagnostics(Action<AstraFlowDiagnosticsOptions>?) |
AstraFlow.Diagnostics |
Register diagnostics after mediator/mapper services so it can snapshot registrations. | IAstraFlowDiagnosticsReporter can create in-memory, JSON, and Markdown reports. |
services.AddAstraFlow(bool validateRequestCoverage = false, params Type[] assemblyMarkerTypes) |
AstraFlow |
Register mediator and mapper together. | Combined setup for applications that intentionally use both packages. |
Mediator
| API | Use It For | Expected Result |
|---|---|---|
IRequest |
Mark a command/request that completes without a response value. | The request can be sent through ISender.Send(IRequest) or runtime Send(object) if exactly one void handler exists. |
IRequest<TResponse> |
Mark a request/command/query and declare its response type. | The request can be sent through ISender if exactly one matching handler exists. |
IRequestHandler<TRequest>.Handle(...) |
Implement void request handling. | The handler completes without returning an application value. |
IRequestHandler<TRequest, TResponse>.Handle(...) |
Implement request handling. | The handler produces the response for one request type. |
ISender.Send(IRequest, CancellationToken) |
Send a strongly typed void request. | Void pipeline behaviors run, then the single void handler runs. |
ISender.Send<TResponse>(IRequest<TResponse>, CancellationToken) |
Send a strongly typed request. | Pipeline behaviors run, then the single handler runs, then the response is returned. |
ISender.Send(object, CancellationToken) |
Send when the request type is known only at runtime. | Same behavior as typed send after AstraFlow verifies the object implements exactly one void or response request contract. |
IPipelineBehavior<TRequest, TResponse>.Handle(...) |
Wrap request handling with validation, logging, authorization, caching, or feature gates. | Behaviors run in DI registration order and may short-circuit. |
IRequestPipelineBehavior<TRequest>.Handle(...) |
Wrap void request handling. | Behaviors run in DI registration order and may short-circuit completion. |
IRequestPreProcessor<TRequest>.Process(...) |
Run logic before a request pipeline. | Pre-processors run before the handler pipeline. |
IRequestPostProcessor<TRequest, TResponse>.Process(...) |
Run logic after a response request succeeds. | Post-processors see the request and response after successful handling. |
IRequestExceptionAction<...>.Execute(...) |
Observe request exceptions for logging/metrics. | Actions run side effects and the original exception is rethrown. |
IRequestExceptionHandler<...>.Handle(...) |
Convert selected request exceptions into handled results. | Handlers must explicitly call SetHandled(...) to suppress the exception. |
IStreamRequest<TResponse> |
Mark a request that returns IAsyncEnumerable<TResponse>. |
The request can be dispatched through IStreamSender. |
IStreamRequestHandler<TRequest, TResponse>.Handle(...) |
Implement stream handling. | The handler returns an async stream without buffering the whole result. |
IStreamSender.CreateStream(...) |
Dispatch a stream request. | Stream behaviors run, then the single stream handler returns the stream. |
IStreamPipelineBehavior<TRequest, TResponse>.Handle(...) |
Wrap stream request handling. | Behaviors can shape or observe the async stream. |
INotification |
Mark an in-process event. | The notification can be published to zero or more handlers. |
INotificationHandler<TNotification>.Handle(...) |
React to a notification. | All handlers for the notification type are invoked sequentially. |
IPublisher.Publish<TNotification>(...) |
Publish a strongly typed notification. | Handlers run according to NotificationFailurePolicy. |
IPublisher.Publish(object, CancellationToken) |
Publish when the notification type is known only at runtime. | AstraFlow verifies the object implements INotification, then publishes it. |
Mapper
| API | Use It For | Expected Result |
|---|---|---|
IMapper.Map<TDestination>(object? source) |
Map a source object to a destination type. | Returns the mapped value, default for null source, or throws when no single rule owns the pair. |
IMapper.Map(object? source, Type destinationType) |
Map when the destination type is known only at runtime. | Same rule lookup behavior as generic mapping. |
IObjectMappingRule.CanMap(Type, Type) |
Declare whether a rule owns a source/destination pair. | Exactly one rule should return true for any active pair. |
IObjectMappingRule.Map(object?, Type, IMapper) |
Implement the mapping code. | Returns the destination object and may use mapper for nested explicit mappings. |
IDeclaredObjectMappingRule.DeclaredMappings |
Make mapping ownership machine-checkable. | Startup validation can catch duplicates, undeclared rules, and declaration drift. |
ObjectMappingPair.Create<TSource, TDestination>() |
Declare an owned mapping pair without repeating typeof(...). |
Produces a pair used by validation and diagnostics. |
IObjectMappingValidator.Validate(MappingOptions) |
Validate registered mapping rules manually. | Throws clear errors for invalid mapping catalogs. |
IProjection<TSource, TDestination>.Expression |
Define provider-translatable query projection. | Used by ProjectWith to keep query DTO shape explicit. |
INamedProjection<TSource, TDestination>.Name |
Give a projection an explicit name. | Multiple projections can safely share the same source/destination pair. |
IProjectionRegistry.Get<TSource, TDestination>() |
Resolve the only unnamed projection for a pair. | Returns the projection or throws clearly for missing/ambiguous registrations. |
IProjectionRegistry.Get<TSource, TDestination>(string name) |
Resolve a named projection. | Returns the named projection or throws clearly for missing/duplicate names. |
IProjectionValidator.Validate(MappingOptions) |
Validate registered projections manually. | Returns stable AFP... findings for duplicates and high-risk expressions. |
query.ProjectWith(...) |
Apply an explicit LINQ projection directly or through the registry. | Returns IQueryable<TDestination> using the supplied/resolved expression. |
ISecureIdCodec |
Plug in application-owned ID encryption/decryption. | AstraFlow stays decoupled from secrets and algorithms. |
SecureIdMapper |
Use secure ID conversion inside mapping rules. | Converts required or optional Guid values to encrypted strings and attempts decryption. |
Diagnostics
| API | Use It For | Expected Result |
|---|---|---|
AddAstraFlowDiagnostics(...) |
Add diagnostics reporting after core AstraFlow registration. | Captures service descriptors and registers the diagnostics reporter. |
IAstraFlowDiagnosticsReporter.CreateReport() |
Create an in-memory report. | Returns registrations, findings, and a health-check-ready summary object. |
IAstraFlowDiagnosticsReporter.CreateJsonReport() |
Export diagnostics for tools or CI. | Returns deterministic camelCase JSON. |
IAstraFlowDiagnosticsReporter.CreateMarkdownReport() |
Export human-readable diagnostics. | Returns a Markdown report with summary, findings, and registration tables. |
DiagnosticSeverity |
Classify findings. | Uses Info, Warning, Error, and Fatal. |
Testing
| API | Use It For | Expected Result |
|---|---|---|
FakeSender |
Record sent requests and return configured responses without a DI container. | Tests can assert request dispatch through RecordedRequest entries. |
FakePublisher |
Record published notifications and optionally run fake handlers. | Tests can assert notification fan-out without a real mediator. |
FakeMediator |
Combine fake sender and publisher behavior. | Units depending on IMediator, ISender, or IPublisher can be tested without mocking frameworks. |
HandlerTestHarness<TRequest, TResponse> |
Execute one request handler directly. | Handler tests stay small and do not require a host. |
PipelineTestHarness<TRequest, TResponse> |
Execute pipeline behaviors around a terminal delegate. | Tests can verify order, short-circuiting, and exception flow. |
NotificationHandlerTestHarness<TNotification> |
Execute one notification handler directly. | Notification handler tests stay focused. |
TestSecureIdCodec |
Deterministic test-only secure ID codec. | Secure ID mapping tests can round-trip IDs without real keys. |
Entity Framework Core
| API | Use It For | Expected Result |
|---|---|---|
dbContext.ValidateProjectionTranslation(projection) |
Validate one projection against EF Core's relational translator. | Returns generated SQL or throws the EF Core translation/model error. |
dbContext.ValidateProjectionTranslations(registry) |
Validate registered projections against an EF Core DbContext. |
Returns AFPEF... findings without executing the query. |
Design Principles
- Explicit by default: mapping rules must be code you can review.
- Security first: sensitive fields are not mapped by naming convention unless a future optional package is explicitly enabled.
- Clear failure modes: missing handlers, duplicate handlers, missing mappings, duplicate mappings, and undeclared mappings fail with actionable messages.
- No application lock-in: AstraFlow does not depend on any private product,
Result, ASP.NET Core MVC, FluentValidation, tenants, permissions, or a specific ID encryption implementation. - Extension-ready: pipelines, notification failure policies, projections, and secure ID codecs are designed as narrow public contracts.
Quick Start: Mediator
using AstraFlow.Mediator;
using Microsoft.Extensions.DependencyInjection;
var services = new ServiceCollection();
services.AddAstraFlowMediator(typeof(CreateInvoiceCommand));
using var provider = services.BuildServiceProvider();
var sender = provider.GetRequiredService<ISender>();
var id = await sender.Send(new CreateInvoiceCommand("INV-1001"));
public sealed record CreateInvoiceCommand(string Number) : IRequest<Guid>;
public sealed class CreateInvoiceCommandHandler
: IRequestHandler<CreateInvoiceCommand, Guid>
{
public Task<Guid> Handle(CreateInvoiceCommand request, CancellationToken cancellationToken)
{
return Task.FromResult(Guid.NewGuid());
}
}
Quick Start: Pipeline Behavior
Pipeline behaviors run in registration order and may short-circuit by not calling next.
services.AddScoped(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
services.AddScoped(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));
services.AddScoped(typeof(IPipelineBehavior<,>), typeof(FeatureGateBehavior<,>));
Quick Start: Mapper
using AstraFlow.Mapper;
using Microsoft.Extensions.DependencyInjection;
var services = new ServiceCollection();
services.AddAstraFlowMapper(typeof(UserMappingRule));
using var provider = services.BuildServiceProvider();
var mapper = provider.GetRequiredService<IMapper>();
var dto = mapper.Map<UserResponse>(new User(Guid.NewGuid(), "admin"));
public sealed record User(Guid Id, string UserName);
public sealed record UserResponse(Guid Id, string UserName);
public sealed class UserMappingRule : IDeclaredObjectMappingRule
{
public IReadOnlyCollection<ObjectMappingPair> DeclaredMappings { get; } =
[
ObjectMappingPair.Create<User, UserResponse>()
];
public bool CanMap(Type sourceType, Type destinationType)
{
return sourceType == typeof(User) && destinationType == typeof(UserResponse);
}
public object? Map(object? source, Type destinationType, IMapper mapper)
{
var user = (User)source!;
return new UserResponse(user.Id, user.UserName);
}
}
Quick Start: Projections
Register projections with the mapper marker assembly, then resolve them through the registry:
public sealed class UserListProjection : INamedProjection<User, UserListItem>
{
public string Name => "list";
public Expression<Func<User, UserListItem>> Expression =>
user => new UserListItem(user.Id, user.UserName);
}
services.AddAstraFlowMapper(
[typeof(UserListProjection)],
options =>
{
options.ValidateProjectionCatalogOnStartup = true;
options.ProjectionValidationMode = ProjectionValidationMode.Warning;
});
var registry = provider.GetRequiredService<IProjectionRegistry>();
var query = db.Users.ProjectWith<User, UserListItem>(registry, "list");
Projection validation reports warnings by default. Set ProjectionValidationMode.Error in CI or strict startup validation when projection findings should fail the build or application startup.
Quick Start: Convention Mapping
Install the optional conventions package only where convention mapping is deliberate:
dotnet add package AstraFlow.Mapper.Conventions --version 1.5.2
Register exact pairs through a profile:
services.AddAstraFlowMapper(typeof(UserProfile));
services.AddAstraFlowConventionMapping(catalog => catalog.AddProfile<UserProfile>());
public sealed class UserProfile : ConventionMappingProfile
{
public UserProfile()
{
CreateMap<User, UserResponse>()
.ForMember(destination => destination.DisplayName, member => member
.MapFrom(source => source.Name)
.Required())
.ForMember(destination => destination.Score, member => member.NullSubstitute(0))
.Ignore(nameof(UserResponse.InternalNote));
}
}
Convention mapping stays disabled for every pair that is not registered. Member rules, converters, conditions, null substitution, enum decisions, and constructor-bound record members are included in mapping plans so every convention-created member can be reviewed before publishing.
Existing-destination updates are separate from read DTO mapping:
CreateMap<UserPatch, User>()
.EnableUpdateMapping()
.ForMember(destination => destination.Email, member => member.Condition(source => source.HasEmail));
provider.GetRequiredService<IConventionMapper>().MapInto(patch, user);
Sensitive destination writes remain blocked unless explicitly allowed.
Quick Start: EF Core Projection Checks
Install the optional package only in projects that need EF Core validation:
dotnet add package AstraFlow.Mapper.EntityFrameworkCore --version 1.5.2
Then ask EF Core to translate registered projections without executing the query:
using AstraFlow.Mapper.EntityFrameworkCore;
var efReport = dbContext.ValidateProjectionTranslations(registry);
Static projection validation catches high-risk expression patterns such as custom method calls. EF Core validation proves the source entity is mapped and the provider can generate SQL for the projection shape.
Secure ID Mapping
AstraFlow.Mapper provides the abstraction, not the cryptography. Applications own the encryption implementation.
services.AddScoped<ISecureIdCodec, MySecureIdCodec>();
services.AddScoped<SecureIdMapper>();
Mapping rules can then depend on SecureIdMapper and emit encrypted string IDs without coupling the package to application secrets.
Notification Failure Policies
Notifications are sequential by default. Configure how failures are handled:
services.Configure<NotificationPublishOptions>(options =>
{
options.FailurePolicy = NotificationFailurePolicy.Aggregate;
options.PublishStrategy = NotificationPublishStrategy.BoundedParallel;
options.MaxDegreeOfParallelism = 4;
});
Policies:
FailFast: stop at the first failing handler.Continue: log failures and run remaining handlers.Aggregate: run all handlers, then throw oneAggregateException.
Publish strategies:
Sequential: default and safest for ordered handlers or shared scoped state.Parallel: run all handlers concurrently.BoundedParallel: run handlers concurrently with a maximum degree of parallelism.
Quick Start: Diagnostics
Register diagnostics after mediator and mapper services:
using AstraFlow.Diagnostics;
services.AddAstraFlowMediator(typeof(CreateInvoiceCommand));
services.AddAstraFlowMapper(typeof(UserMappingRule));
services.AddAstraFlowDiagnostics(options =>
{
options.AssemblyMarkerTypes.Add(typeof(CreateInvoiceCommand));
options.AssemblyMarkerTypes.Add(typeof(UserMappingRule));
});
Create reports:
var reporter = provider.GetRequiredService<IAstraFlowDiagnosticsReporter>();
var report = reporter.CreateReport();
var json = reporter.CreateJsonReport();
var markdown = reporter.CreateMarkdownReport();
Diagnostics are framework-neutral and do not expose request payloads, DTO payloads, secrets, tokens, or connection strings.
Quick Start: Testing
Install the optional testing package in test projects:
dotnet add package AstraFlow.Testing --version 1.5.2
Use the fake mediator to record requests and notifications:
var mediator = new FakeMediator()
.RespondWith<CreateInvoiceCommand, Guid>(Guid.NewGuid());
var id = await mediator.Send(new CreateInvoiceCommand("INV-1001"));
mediator.Requests.SingleSent<CreateInvoiceCommand>();
The testing package is framework-neutral and does not depend on xUnit, NUnit, MSTest, FluentAssertions, or a mocking framework.
v1 Non-Goals
AstraFlow v1 intentionally does not include convention mapping, flattening, reverse-map generation, compatibility shims, source generators, or analyzers. Those belong in optional packages after the explicit core is stable in real production use.
Roadmap
The long-term plan is to continue improving mediator ergonomics, optional convention mapping, advanced mapping parity, analyzers, source generators, OpenTelemetry hooks, benchmark projects, ASP.NET Core helpers, validation integration, CLI/templates, broader EF Core provider checks, and transition tooling. These will remain opt-in so the secure explicit core stays predictable.
Branding
The package icon is stored at assets/branding/astraflow-icon.png and is included in every NuGet package through PackageIcon.
Generator prompt:
Create a square app/package icon for a .NET library named AstraFlow. Use an abstract orbital star and flowing path motif that suggests explicit application flow, mediator dispatch, and auditable mapping. Keep it as a clean vector-friendly modern tech logo with crisp edges, centered symbol only, no text, strong silhouette readable at 64x64, generous padding, deep navy background with cyan, teal, white, and a small warm amber star accent. Avoid words, letters, code snippets, watermarks, photorealism, and complex gradients.
Repository Readiness
The package folder includes CI, a gated publish workflow, security policy, contributing guide, changelog, samples, and release checklist. Publishing should happen only after:
- package tests pass,
- representative consumer applications build against the package projects or packed packages successfully,
- package artifacts build with XML docs and symbols,
- the API surface is reviewed for v1 stability,
- NuGet Trusted Publishing is configured, or a scoped GitHub Actions publishing secret is configured in the release repository.
For first publish setup, create a dedicated GitHub repository, copy this folder into the repository root, configure Trusted Publishing or the documented GitHub secret, and run the gated publish workflow. See docs/publishing.md.
License
MIT.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- AstraFlow.Mapper (>= 1.6.2)
- Microsoft.EntityFrameworkCore.Relational (>= 10.0.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
AstraFlow 1.6.2:
- Promotes v1.6.x inheritance and polymorphic mapping candidate follow-ups.
- Adds IncludeBase and IncludeDerived for explicit convention mapping hierarchy support.
- Adds AFC017, AFC018, and AFC019 diagnostics for inheritance and polymorphic mapping visibility.
- Full changelog: https://github.com/seifmoustafa/AstraFlow/blob/main/CHANGELOG.md
- GitHub releases: https://github.com/seifmoustafa/AstraFlow/releases