NHibernate Pitfalls: Versioned Entities Are Not Batcheable
This is part of a series of posts about NHibernate Pitfalls. See the entire collection here.
This is a problem similar to the one with native id generators. Basically, because there are different versioning strategies – timestamp, counter, native, etc, – NHibernate needs to issue a SELECT after a versioned entity is INSERTEd or UPDATEd. While this wouldn’t be necessary when NHibernate manages the version on the “client side”, like:
1: UPDATE MyEntity SET Version = 2 WHERE ...;
2: //or
3: UPDATE MyEntity SET Version = GETDATE() WHERE ...;
But not if the version is handled on the database side, like when using SQL Server’s ROWVERSION/TIMESTAMP columns or Oracle’s ORA_ROWSCN pseudo-columns. In these cases, NHibernate needs to issue a SELECT after each INSERT or UPDATE:
1: UPDATE MyEntity SET ... WHERE ...;
2: SELECT Version FROM MyEntity WHERE ...;
This breaks batching, because it needs to be done immediately after each INSERT/UPDATE.