ISession.Load returns object with zero ID

Recently we had a following problem with NHibernate, and although I love NHiberante, it does not always behave as expected.
We have a Person class correctly mapped in NHibernate:
public class Person
{
public int Id { get; set; }
public int Name { get; set; }
}
We saw that sometimes we were getting a Person with Id equal to zero, from our repository:
public class PersonRepository
{
private ISession _session;
//...
public Person LoadById(int id)
{
return _session.Load<person>(id);
}
}
We narrowed the problem down and wrote this little test:
[Test]
public void LoadById_Loads_IdIsSet()
{
_context.ExecuteInTransaction(() =>
{
Person person = _context.PersonRepository.LoadById(7);
Assert.AreEqual(7, person.Id);
}
);
}
…which of course failed.
After initial surprise, we took a second look at the Person class and we saw that we are missing virtual keyword on properties. NHibernate is not able to create a correct Proxy object.
public class Person
{
public virtual int Id { get; set; }
public virtual int Name { get; set; }
}
This fixed the issue.
Strange thing is that we expect that NHibernate would throw an exception is such case.
April 2nd, 2014 at 09:18
What about test with ‘Get’ instead of ‘Load’?
April 2nd, 2014 at 10:13
@dario-g “Get” would work, but we needed Load for performance reasons.