-
Notifications
You must be signed in to change notification settings - Fork 932
Description
I've been optimising some code by attempting to add lock hints and I get a different exception depending on where I put the WithLock call in my query. I initially tried this on NHibernate 5.5.2 and then updated to 5.6 to see if it resolved the issue. I get a different exception based on where I add the WithLock call and it fails wherever I put it. I can only find oblique references to the existence of WithLocks and I can't find any examples but I can't see why what I'm doing shouldn't work. . Just in case its pertinent this is on Windows using MySql.
This query works:
var pages = session.Query<Page>()
.Where(x => x.File.Id == lookupFile.Id)
.OrderBy(x => x.PageNumber)
.Select(x => new PageDto
{
Id = x.Id,
PageNumber = x.PageNumber,
Status = x.Status,
})
.ToList();
If I add locking after the where clause:
var pages = session.Query<Page>()
.Where(x => x.File.Id == lookupFile.Id)
.WithLock(LockMode.Upgrade)
.OrderBy(x => x.PageNumber)
.Select(x => new PageDto
{
Id = x.Id,
PageNumber = x.PageNumber,
Status = x.Status,
})
.ToList();
It throws:
System.InvalidOperationException: could not locate alias to apply lock mode : x
Note that I get a different exception from each of the 4 possible places to put the WithLock call.
If I remove the Select clause entirely and retrieve the whole entity then the query doesn't throw an exception.
var pages = session.Query<Page>()
.Where(x => x.File.Id == lookupFile.Id)
.WithLock(LockMode.Upgrade)
.OrderBy(x => x.PageNumber)
.ToList();
I don't want the memory overhead of loading the whole row if I can avoid it but not sure if this is a bug or a deliberate NHibernate design with opaque error handling.