NHibernate的问题很多人都没有更新实体

时间:2010-09-06 11:01:47

标签: nhibernate

我有一个简单的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确保集合的两侧都能正确保湿或者我错过了什么。

2 个答案:

答案 0 :(得分:1)

会话在哪里刷新并清除? 您是否清除了AddUserToRole方法和断言之间的nhibernate会话?

可能是members.GetRoleByName(rolename)从身份地图中获取角色。

答案 1 :(得分:0)

我已经弄清楚双向关系正在发生什么。当角色被添加到用户NH的角色集合时,不会产生关系的另一面。迫使NH进行双向制定的最简单方法是清除ISession或者驱逐两个实体(我的偏好)。这迫使NH访问数据库并正确构建关系的两个方面。即newUser.Roles [0]包含添加的角色,newRole.Users [0]包含用户 - 就像我想要的那样。

我还发现我的测试工具有一个错误并创建了两个不同的会话: - (