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的对象出现时,它只使用已加载的对象(这是身份映射模式的正确行为)。您可以从会话中退出原始对象,但最好使用不同的对象。实际上,您应该在测试设置中创建它们,而不是在测试方法中。