我有一个简单的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; }
}
基类具有Id的属性。
映射是这样的:
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有一个条目。但是,角色中的IList没有条目。我知道我只能从用户实体中保存,因为我在收集地图上有Inverse,但我希望NH确保集合的两侧都能正确保湿或者我错过了什么。
答案 0 :(得分:1)
会话在哪里刷新并清除? 您是否清除了AddUserToRole方法和断言之间的nhibernate会话?
可能是members.GetRoleByName(rolename)从身份地图中获取角色。
答案 1 :(得分:0)
我已经弄清楚双向关系正在发生什么。当角色被添加到用户NH的角色集合时,不会产生关系的另一面。迫使NH进行双向制定的最简单方法是清除ISession或者驱逐两个实体(我的偏好)。这迫使NH访问数据库并正确构建关系的两个方面。即newUser.Roles [0]包含添加的角色,newRole.Users [0]包含用户 - 就像我想要的那样。
我还发现我的测试工具有一个错误并创建了两个不同的会话: - (