I believe I've discovered an issue with the new build-in proxy factory for 
NHibernate.

If you have a proxy object which was created using ISession.Load<>(), then 
exceptions within NHibernate itself and the use of the NHibernate Profiler 
both will call ToString() on that proxy object. This results in an unwanted 
database look up for that entity.

I've already reported this issue with the NHibernate Profiler 
team: https://groups.google.com/d/msg/nhprof/V_001ogMYC0/RVF0Ys5XQw4J

The best way to demonstrate it is to do a test like this:

session.CreateCriteria<Bar>().Add(Restrictions.Eq("FooReference", 
session.Load<Foo>(Guid.NewGuid()))).List();

Assuming the correct database schema, one would expect this line of code to 
simply return an empty list. However if you have the NHibernate Profiler 
hooked up and execute this line of code, NHibernate will attempt will to 
load the instance of Foo (the profiler I think is calling  ToString() for 
its output). In this specific example, since the Id is random, it throws an 
exception.

Additionally, if the above query generates an exception (for instance the 
database schema is wrong and the query cannot execute), NHibernate appears 
to call ToString() on the proxy object when generating the exception 
message. Which, again in this example, will cause a look up, which in turn 
throws an exception saying that the row does not exist.

Reply via email to