Nhibernate 正在获取要加载的多个关系

Nhibernate 正在获取要加载的多个关系,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我有一个用户对象,其中包含它所属的组列表: public UserHeaderMap() { Table("USER_HEADER"); Id(x => x.Id, "USER_ID"); HasManyToMany(x => x.Groups) .Table("USER_GROUP_COMPOSITE") .ParentKeyColumn("USER_ID") .ChildKeyColumn("GROUP_I

我有一个用户对象,其中包含它所属的组列表:

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();
}
我需要如何修改映射或检索用户对象的方式,以便在检索时填充组列表?我肯定这里有不同的选择,但我不确定哪一个是最好的。每当我从数据库检索用户对象时,集合当前为空。我使用以下方法检索它:

UserHeader userFound = session.Load<UserHeader>(newUser.Id);
UserHeader userFound=session.Load(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();
    }
}
public类UserHeader
{
公共虚拟Guid Id{get;set;}
公共虚拟IList组{get;set;}
公共用户头(IList组)
{
组=组;
}
公共UserHeader()
{
组=新列表();
}
公共覆盖布尔等于(对象对象对象)
{
bool-retVal=false;
if(obj是UserHeader)
{
UserHeader otherUser=(UserHeader)obj;
if(Id==otherUser.Id)
retVal=true;
}
返回返回;
}
公共覆盖int GetHashCode()
{
返回Id.GetHashCode();
}
}
Edit2: 这是我最初查询数据的方式。它抓住了一切,除了多对多的关系

UserHeader userFound = session.CreateCriteria<UserHeader>()
                              .Add(Example.Create(newUser))
                              .UniqueResult<UserHeader>();
UserHeader userFound=session.CreateCriteria()
.Add(例如.Create(newUser))
.UniqueResult();
Edit3:单元测试 以下单元测试在foreach(userFound.Groups中的GroupHeader组)上失败。我可以从SQL中清楚地看到,它正在SQL输出中创建用户和组之间的关系。如果有必要,我可以把它寄出去

[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();
        }
    }
}
[TestMethod]
public void CanAddUserToGroup()
{
使用(NHibernate.ISession session=SessionOrigin.Current.GetSession())
{
使用(NHibernate.ITransaction tran=session.BeginTransaction())
{
session.SaveOrUpdate(newUser);
session.SaveOrUpdate(新组);
trans.Commit();
}
newGroup.AddUser(newUser);
使用(NHibernate.ITransaction tran=session.BeginTransaction())
{
session.SaveOrUpdate(新组);
trans.Commit();
}
GroupHeader groupFound=session.CreateCriteria()
.Add(例如.Create(newGroup))
.UniqueResult();
UserHeader userFound=session.CreateCriteria()
.Add(例如.Create(newUser))
.UniqueResult();
UserHeader userFound2=session.Load(newUser.Id);
Assert.IsNotNull(groupFound,“插入后找不到组”);
Assert.IsNotNull(userFound,“插入后找不到用户”);
UserHeader userInGroup=null;
GroupHeader-groupInUser=null;
foreach(groupFound.Users中的UserHeader用户)
{
if(user.Equals(newUser))
userInGroup=用户;
}
foreach(userFound.Groups中的GroupHeader组)
{
if(组等于(新组))
groupInUser=组;
}
Assert.IsNotNull(userInGroup,“未能向组中添加新用户”);
Assert.IsNotNull(groupInUser,“未能向用户添加新组”);
使用(NHibernate.ITransaction tran=session.BeginTransaction())
{
删除(新用户);
删除(新组);
trans.Commit();
}
}
}

您的单元测试代码不正确

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

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


最后但并非最不重要的一点是,您在同一测试方法中测试了太多不相关的内容。

集合不应为null,它应为空。我们可以看到您的UserHeader POCO吗?另外,
session.Load
不会导致从数据库加载。它只得到一个代理。@Chad,我在上面添加了我的POCO。@Diego,我添加了我最初查询下面数据的方式Edit2@ColeW:您如何知道它返回空值?我们可以看到您的全部使用情况吗?我假设,因为我在控制台输出中看到了SELECT查询,所以它是从数据库而不是从会话中获取用户信息的。我是否需要创建一个新会话来准确地测试用户是否被添加到组中?@ColeW:它确实查询数据库,但当同一类中具有相同Id的对象出现时,它只使用已加载的对象(这是身份映射模式的正确行为)。您可以从会话中退出原始对象,但最好使用不同的对象。实际上,您应该在测试设置中创建它们,而不是在测试方法中。