【发布时间】:2010-09-06 11:01:46
【问题描述】:
我有一个包含用户和角色的简单 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]);
}
第一组 Asserts 传递 - User 中的 IList 有一个条目。但是,角色中的 IList 具有零条目。我知道我只能从 User 实体中保存,因为我在集合地图上有 Inverse,但我希望 NH 确保集合的两侧都正确补水,否则我错过了一些东西。
【问题讨论】:
-
我不是 FluentNH 专家,但您确定两个关系使用同一个表吗?另外,AddUserToRole 是做什么的?你什么时候冲洗?如果您使用不同的会话来检索 savedRole,会发生什么?
-
Diego,Fluent 正在使用约定来使两边的表名保持一致——在这种情况下,它是 RolesToUsers,并使 FK Role_id 和 User_id。 AddUserToRole 是我的 MembershipService 中的一个方法,它获取用户并获取角色,然后在 SaveOrUpdate 之前添加到 IList。没有明确的刷新,只是围绕一个事务。我将尝试使用不同的会话。
标签: nhibernate