I've got a problem with NHibernate and, as I suppose, with lazy load.
I've got two entity classes, that are related to each other:
public class User
{
// lots of properties
public virtual Role Role { get; set; }
}
public class Role
{
// properties
public virtual IList<User> UsersInRole { get;set; }
public Role()
{
this.UsersInRole = new List<User>();
}
}
Relation is One-To-Many (One role - Many users). Classes are mapped with Fluent as following:
public class UserMapping : ClassMap<Models.Accounts.User>
{
public UserMapping()
{
this.Table("Users");
this.Id(u => u.ID).GeneratedBy.Native();
//properties mapping
this.References<Models.Accounts.Role>(u => u.Role);
}
}
public class RoleMapping : ClassMap<Models.Accounts.Role>
{
public RoleMapping()
{
this.Table("Roles");
this.Id(r => r.ID).GeneratedBy.Native();
// properties mapping
this.HasMany<User>(r => r.Users).AsBag().Inverse().KeyColumn("Role_id");
}
}
When I'm creating a Role, and assign some User to it - Role::Users property is null until session is closed and another one is opened. So, consider following code:
object Foo()
{
var session = FluentManager.OpenNewSession();
var t1 = session.BeginTransaction();
Role role = new Role("admin");
session.SaveOrUpdate(role);
t1.Commit();
var t2 = session.BeginTransaction();
session.SaveOrUpdate(new User() { Login = "log1", Role = role });
t2.Commit();
Role oldRole = session.Get<Role>((uint)1);
return oldRole.Users; // null here
}
On the other hand, following code works fine:
object Foo()
{
var session = FluentManager.OpenNewSession();
var t1 = session.BeginTransaction();
Role role = new Role("admin");
session.SaveOrUpdate(role);
t1.Commit();
var t2 = session.BeginTransaction();
session.SaveOrUpdate(new User() { Login = "log1", Role = role });
t2.Commit();
session.Close();
var session2 = FluentManager.OpenNewSession();
Role oldRole = session2.Get<Role>((uint)1);
return oldRole.Users; // Actual list of users
}
Though, I'd like to work with collection of users in a given role w/out session close. What I did wrong? Many thanks in advance.
PS: I'm using Fluent NHibernate 1.2 with SQLite database, if that matters.
oldRole.UsersInRole
? Is is really null, not just empty? – Stefan Steinegger