Properties in .net are just syntactical sugar; they ultimately get translated to methods:
Code:
public string Username {
get { ... }
set { ... }
}
becomes
Code:
public string get_Username() { ... }
public void set_Username(string value) { ... }
You would not have gotten this error a year ago in NHibernate 1.0 because in NHibernate 1.2, the default changed to lazy="true" for all classes. As a result, all methods and properties in a mapped class must be virtual unless you explicitly set lazy="false"; or you specify something else (such as an interface) as its proxy.