-
Notifications
You must be signed in to change notification settings - Fork 932
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support for DbBatch #3461
base: master
Are you sure you want to change the base?
Support for DbBatch #3461
Conversation
Just a thought for the discussion (do not need to implement straight away). The .NET Core since 3 supports default interface members. With it we can add methods to interfaces without introducing breaking changes (it is similar to adding a virtual method for the class in prior versions). Since the DbBatch is .NET 6 and above we could use default methods to extend interfaces instead of doing our usual shimming. This should simplify code a little bit. |
Yes! I wanted to use that but didn't realize the compiler directives actually meant that I could. Fixed. |
We could make it select the DbBatchBatcher automatically when possible, but perhaps that is something we should/could wait with. |
@hazzik Thanks for helping out! A couple of ideas.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks good to me excepted a few commented details.
Co-authored-by: Frédéric Delaporte <[email protected]>
Co-authored-by: Frédéric Delaporte <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you please change not implemented exceptions to not supported?
@@ -6,5 +7,9 @@ public interface IDriveConnectionCommandProvider | |||
{ | |||
DbConnection CreateConnection(); | |||
DbCommand CreateCommand(); | |||
#if NET6_0_OR_GREATER | |||
DbBatch CreateBatch() => throw new NotImplementedException(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Throwing not supported exception probably would be better here
src/NHibernate/Driver/IDriver.cs
Outdated
/// </summary> | ||
/// <returns></returns> | ||
/// <exception cref="NotImplementedException"></exception> | ||
DbBatch CreateBatch() => throw new NotImplementedException(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same, I think not supported is better.
src/NHibernate/Driver/IDriver.cs
Outdated
/// May be a no-op if the driver does not support preparing commands, or for any other reason. | ||
/// </summary> | ||
/// <param name="dbBatch">The batch.</param> | ||
void PrepareBatch(DbBatch dbBatch) => throw new NotImplementedException(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Probably should be no-op instead
src/NHibernate/Driver/IDriver.cs
Outdated
/// <param name="dbCommand"></param> | ||
/// <returns></returns> | ||
/// <exception cref="NotImplementedException"></exception> | ||
DbBatchCommand CreateDbBatchCommandFromDbCommand(DbBatch dbBatch, DbCommand dbCommand) => throw new NotImplementedException(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Better to throw not supported exception here.
Observations
A DbBatch looks like a DbCommand, but just on the surface.
Unlike batching which uses an underlying
DbCommand
,DbBatch
will require special handling for things such asPrepare
,Enlist
etc. While theDbBatch
could theoretically be wrapped in aDbCommand
"adapter" or even a NH specific "DbCommandOrBatch
", sinceDbBatch
is now a part of the core .NET 6+ API, I think the route forward is to be explicit about it, e.g. having bothEnlist(DbCommand)
andEnlist(DbBatch)
.This means that a transparent move is harder, since custom derivatives of e.g MicrosoftDataSqlClientDriver may have vital implementations of e.g
AdjustCommand
that will have to be duplicated forDbBatch
.No really good way to create a DbBatchCommand from a DbCommand
If I'm not missing something, I think this is a bit of an oversight on the part of the
DbBatch
creators, especially since they already use "CanDoXxxx
" properties.All the parameters in a
DbCommand
will have to be recreated for theDbBatchCommand
, since they can't be attached to twoDbParameterCollections
at the same time. The good ol'SqlCommandSet
uses a bit of trickery for that, but I just opted to make sure that theDbParameter
isICloneable
, and used that. Perhaps the value should be explicitly cloned too, if it'sICloneable
. Making it possible to override this logic is probably a good idea.ReflectionBasedDriver doesn't use DbProviderFactoryDriveConnectionCommandProvider on .NET 5 and above
Any reason for this, or just an effect of NETSTANDARD2_1_OR_GREATER not including NET5 etc.?