让ManyToMany关系加载

时间:2011-04-01 20:16:08

标签: nhibernate fluent-nhibernate

我有User对象,其中包含它所属的组列表:

public UserHeaderMap()
{
    Table("USER_HEADER");
    Id(x => x.Id, "USER_ID");

    HasManyToMany(x => x.Groups)
        .Table("USER_GROUP_COMPOSITE")
        .ParentKeyColumn("USER_ID")
        .ChildKeyColumn("GROUP_ID")
        .Cascade.SaveUpdate()
        .Inverse();
}

如何在检索时修改我的映射或我检索用户对象以填充“组”列表的方式?我相信这里有不同的选择,但我不确定哪个是最好的。每当我从数据库中检索User对象时,该集合当前为null。我用它来检索它:

UserHeader userFound = session.Load<UserHeader>(newUser.Id);

修改

public class UserHeader
{
    public virtual Guid Id { get; set; }
    public virtual IList<GroupHeader> Groups { get; set; }

    public UserHeader(IList<GroupHeader> groups)
    {
        Groups = groups;
    }

    public UserHeader()
    {
        Groups = new List<GroupHeader>();
    }

    public override bool Equals(object obj)
    {
        bool retVal = false;
        if (obj is UserHeader)
        {
            UserHeader otherUser = (UserHeader)obj;

            if (Id == otherUser.Id)
                retVal = true;
        }

        return retVal;
    }

    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}

EDIT2: 这是我最初查询数据的方式。它抓住了除了多对多关系之外的一切。

UserHeader userFound = session.CreateCriteria<UserHeader>()
                              .Add(Example.Create(newUser))
                              .UniqueResult<UserHeader>();

编辑3:单元测试 foreach上的以下单元测试失败(userFound.Groups中的GroupHeader组)。我可以从SQL中清楚地看到它在SQL输出中创建了User和Group之间的关系。如有必要,我可以发布。

[TestMethod]
public void CanAddUserToGroup()
{
    using (NHibernate.ISession session = SessionOrigin.Current.GetSession())
    {
        using (NHibernate.ITransaction tran = session.BeginTransaction())
        {
            session.SaveOrUpdate(newUser);
            session.SaveOrUpdate(newGroup);
            tran.Commit();
        }

        newGroup.AddUser(newUser);
        using (NHibernate.ITransaction tran = session.BeginTransaction())
        {
            session.SaveOrUpdate(newGroup);
            tran.Commit();
        }

        GroupHeader groupFound = session.CreateCriteria<GroupHeader>()
            .Add(Example.Create(newGroup))
            .UniqueResult<GroupHeader>();

        UserHeader userFound = session.CreateCriteria<UserHeader>()
            .Add(Example.Create(newUser))
            .UniqueResult<UserHeader>();

        UserHeader userFound2 = session.Load<UserHeader>(newUser.Id);

        Assert.IsNotNull(groupFound, "Failed to find group after insertion");
        Assert.IsNotNull(userFound, "Failed to find user after insertion");

        UserHeader userInGroup = null;
        GroupHeader groupInUser = null;

        foreach (UserHeader user in groupFound.Users)
        {
            if (user.Equals(newUser))
                userInGroup = user;
        }

        foreach (GroupHeader group in userFound.Groups)
        {
            if (group.Equals(newGroup))
                groupInUser = group;
        }

        Assert.IsNotNull(userInGroup, "Failed to add a new user to group");
        Assert.IsNotNull(groupInUser, "Failed to add a new group to a user");

        using (NHibernate.ITransaction tran = session.BeginTransaction())
        {
            session.Delete(newUser);
            session.Delete(newGroup);
            tran.Commit();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您的单元测试代码不正确。

由于组和用户都已加载到会话中,因此条件查询将返回相同的实例。

如果集合在内存中为null,则查询后它们仍然为null。此外,您只是添加到双向关联的一侧。

最后但同样重要的是,您在同一测试方法中测试了太多不相关的东西。