У меня есть объект 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 из базы данных. Я получаю это, используя это:
UserHeader userFound = session.Load<UserHeader>(newUser.Id);
Edit:
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>();
Edit3: модульный тест
Следующий модульный тест завершается неудачно на foreach (группа GroupHeader в userFound.Groups). Я ясно вижу из 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();
}
}
}