zzzprojects / EntityFramework-Plus

Entity Framework Plus extends your DbContext with must-haves features: Include Filter, Auditing, Caching, Query Future, Batch Delete, Batch Update, and more
https://entityframework-plus.net/
MIT License
2.27k stars 318 forks source link

BulkMergeAsync ignores columns with default values in generated INSERT #813

Open bengavin opened 2 weeks ago

bengavin commented 2 weeks ago

1. Description

When generating the MERGE statement, columns which have an EFCore fluent configured default value are ignored when generating the INSERT portion of the SQL statement. They are included in the staging table and in the UPDATE portion of the statement.

2. Exception

N/A

3. Fiddle or Project

Not available at this time, I may have time to put one together later.

4. Any further technical details

Removing the 'HasDefaultValue(...)' configuration on the properties restores the expected behavior. I would expect that, if a database default value was to be returned, it would only be used/returned in the case where the source property on the entity being saved was NULL.

NOTE: This behavior does -not- happen when using BulkSaveChangesAsync

Further technical details

JonathanMagnan commented 2 weeks ago

Hello @bengavin ,

That's currently the default behavior. Properties with default values are always ignored by default.

However, you can choose which behavior you want with the option ExplicitValueResolutionMode

By using this following options options.ExplicitValueResolutionMode = Z.EntityFramework.Extensions.ExplicitValueResolutionMode.AlwaysKeepValueOnInsert; now values will always be inserted in the Insert part of the BulkMerge

You can see an online example using this option here

At this moment, only the BulkInsert supports hybrid cases when some entities have value explicitly set and some don't through the SmartDefaultValueOnBulkInsert and SmartPartialResolutionOnBulkInsert mode.

Let me know if that answer correctly to your question.

Best Regards,

Jon

JonathanMagnan commented 2 weeks ago

Hello @bengavin,

Since our last conversation, we haven't heard from you.

Let me know if you have any questions.

Best regards, Jon

bengavin commented 2 weeks ago

Thanks @JonathanMagnan - that gets us around the current issue for the moment, is there a plan to implement the smart defaults approach in the merge operation so it functions like the bulk insert?

JonathanMagnan commented 2 weeks ago

Hello @bengavin ,

I will talk with my employees next Monday to evaluate the difficulty.

Best Regards,

Jon