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.