Skip to content

馃悶fix: Output mapping of updated entities on merge - #26

Merged
lukaferlez merged 4 commits into
lukaferlez:masterfrom
filipklaric:fix/merge-output-map-updated-entities
Aug 17, 2026
Merged

馃悶fix: Output mapping of updated entities on merge#26
lukaferlez merged 4 commits into
lukaferlez:masterfrom
filipklaric:fix/merge-output-map-updated-entities

Conversation

@filipklaric

Copy link
Copy Markdown
Contributor

Updated rows returned by MERGE were matched back onto entities by primary key, so merging on any other columns left the generated key unmapped, as the entity has no key to match on yet. Match updated rows on the columns the merge was performed on instead, which is sound because a row comes back as an update precisely when it matched the entity on those columns.

Matched entities that are already in sync produce no OUTPUT row at all, since Update() always added a difference check on the columns. Make that check optional through Update(checkConditionOnColumns) and expose it on UpsertAsync/UpsertBulkAsync, so callers can trade the extra writes for having every matched entity mapped.

filipklaric-lgtm and others added 2 commits July 31, 2026 12:19
Updated rows returned by MERGE were matched back onto entities by primary
key, so merging on any other columns left the generated key unmapped, as
the entity has no key to match on yet. Match updated rows on the columns
the merge was performed on instead, which is sound because a row comes
back as an update precisely when it matched the entity on those columns.

Matched entities that are already in sync produce no OUTPUT row at all,
since Update() always added a difference check on the columns. Make that
check optional through Update(checkConditionOnColumns) and expose it on
UpsertAsync/UpsertBulkAsync, so callers can trade the extra writes for
having every matched entity mapped.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
int? commandTimeout = null,
Action<MergeKeyOptions> key = null,
Action<IEnumerable<T>, IEnumerable<T>, IEnumerable<PropertyInfo>, IEnumerable<PropertyInfo>> outputMap = null,
bool checkConditionOnColumns = true,

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To make this more readable/obvious of intent, I'd modify this where instead of the outputmap we will have OutputOptions object that will have an "outputmap" property and a "MapChangedOnly=true", so that you can then set that to false if you want.

Then we should add an override that would take in just the outputmap to maintain backward compatibility.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed.

@lukaferlez
lukaferlez merged commit 70f4fd6 into lukaferlez:master Aug 17, 2026
1 check passed
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.

3 participants