Получение отношения ManyToMany для загрузки - PullRequest
0 голосов
/ 02 апреля 2011

У меня есть объект 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();
        }
    }
}

1 Ответ

1 голос
/ 02 апреля 2011

Неверный код вашего юнит-теста.

Поскольку и группа, и пользователь уже загружены в сеанс, запросы критериев возвращают одинаковые экземпляры.

Если коллекции были нулевыми в памяти, они все равно будут нулевыми после запроса. Кроме того, вы добавляете только одну сторону двунаправленной ассоциации.

И последнее, но не менее важное: вы тестируете слишком много несвязанных вещей в одном и том же методе тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...