У меня есть простая модель домена NHibernate с пользователями и ролями.Между Пользователем и Ролями существует много-много связей.Упрощенные сущности:
public class User : Entity<Guid>
{
private IList<Role> _roles;
public User()
{
_roles = new List<Role>();
}
public virtual UserName { get; set; }
public virtual IList<Role> Roles { get; protected set; }
}
public class Role : Entity<Guid>
{
private IList<User> _users;
public Role ()
{
_users = new List<User>();
}
public virtual RoleName { get; set; }
public virtual IList<User> Users { get; protected set; }
}
Базовый класс имеет свойство для идентификатора.
Отображения таковы:
public class UserMap : ClassMap<User>
{
public UserMap()
{
LazyLoad();
Id(x => x.Id)
.GeneratedBy
.GuidComb();
Map(x => x.UserName)
.Length(50)
.Not.Nullable()
.Unique();
HasManyToMany(x => x.Roles)
.Cascade.SaveUpdate();
}
}
public class RoleMap : ClassMap<Role>
{
public RoleMap()
{
LazyLoad();
Id(x => x.Id)
.GeneratedBy.GuidComb();
Map(x => x.RoleName)
.Length(20)
.Unique()
.Not.Nullable();
HasManyToMany(x => x.Users)
.Cascade.SaveUpdate()
.Inverse();
}
}
Я позволил FluentNH создать свой DDL и могу создать/ обновить / удалить пользователей и роли.Проблема в моем модульном тесте для can_add_role_to_user ().Упрощенный тест выглядит следующим образом:
public void can_add_role_to_user ()
{
var user = members.CreateUser(username);
var role = members.CreateRole(rolename, roledescription);
bool result = members.AddUserToRole (username, rolename);
// Assert
Assert.AreEqual (true, result);
var savedUser = members.GetUserByName(username);
Assert.IsNotNull(savedUser);
Assert.AreEqual (1, savedUser.Roles.Count); // Check role has been added to user
Assert.AreEqual (user, savedUser);
Assert.AreEqual (role, savedUser.Roles[0]);
var savedRole = members.GetRoleByName(rolename);
Assert.IsNotNull(newrole);
Assert.AreEqual(1, newrole.Users.Count); // Check user has been added to role - fails
Assert.AreEqual (role, newrole);
Assert.AreEqual (user, newrole.Users[0]);
}
Первый набор проходов подтверждений - IList в User имеет одну запись.Однако IList в роли имеет нулевые записи.Я знаю, что могу сохранить только из сущности «Пользователь», так как на карте коллекции у меня есть «Инверсия», но я бы ожидал, что NH позаботится о том, чтобы обе стороны коллекции были правильно увлажнены, или я что-то упустил.