Проблема с NHibernate Многие ко Многим, не обновляющая сущность - PullRequest
1 голос
/ 06 сентября 2010

У меня есть простая модель домена NHibernate с пользователями и ролями.Между Пользователем и Ролями существует много-много связей.Упрощенные сущности:

public class User : Entity<Guid>
{
    private IList<Role> _roles;

    public User()
    {
        _roles = new List<Role>();
    }

    public virtual UserName { get; set; }

    public virtual IList<Role> Roles { get; protected set; }
}

public class Role : Entity<Guid>
{
    private IList<User> _users;

    public Role ()
    {
        _users = new List<User>();
    }

    public virtual RoleName { get; set; }

    public virtual IList<User> Users { get; protected set; }
}

Базовый класс имеет свойство для идентификатора.

Отображения таковы:

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        LazyLoad();
        Id(x => x.Id)
            .GeneratedBy
            .GuidComb();

        Map(x => x.UserName)
            .Length(50)
            .Not.Nullable()
            .Unique();

        HasManyToMany(x => x.Roles)
            .Cascade.SaveUpdate();
    }
}

public class RoleMap : ClassMap<Role>
{
    public RoleMap()
    {
        LazyLoad();
        Id(x => x.Id)
            .GeneratedBy.GuidComb();

        Map(x => x.RoleName)
            .Length(20)
            .Unique()
            .Not.Nullable();

        HasManyToMany(x => x.Users)
        .Cascade.SaveUpdate()
        .Inverse();
    }
}

Я позволил FluentNH создать свой DDL и могу создать/ обновить / удалить пользователей и роли.Проблема в моем модульном тесте для can_add_role_to_user ().Упрощенный тест выглядит следующим образом:

public void can_add_role_to_user ()
{
    var user = members.CreateUser(username);
    var role = members.CreateRole(rolename, roledescription);

    bool result = members.AddUserToRole (username, rolename);

    // Assert
    Assert.AreEqual (true, result);
    var savedUser = members.GetUserByName(username);
    Assert.IsNotNull(savedUser);
    Assert.AreEqual (1, savedUser.Roles.Count); // Check role has been added to user
    Assert.AreEqual (user, savedUser);
    Assert.AreEqual (role, savedUser.Roles[0]);

    var savedRole = members.GetRoleByName(rolename);
    Assert.IsNotNull(newrole);
    Assert.AreEqual(1, newrole.Users.Count);    // Check user has been added to role - fails
    Assert.AreEqual (role, newrole);
    Assert.AreEqual (user, newrole.Users[0]);
}

Первый набор проходов подтверждений - IList в User имеет одну запись.Однако IList в роли имеет нулевые записи.Я знаю, что могу сохранить только из сущности «Пользователь», так как на карте коллекции у меня есть «Инверсия», но я бы ожидал, что NH позаботится о том, чтобы обе стороны коллекции были правильно увлажнены, или я что-то упустил.

Ответы [ 2 ]

1 голос
/ 06 сентября 2010

Где сеанс сбрасывается и очищается? Вы очищаете свой nhibernate-сеанс между вашим методом AddUserToRole и вашими утверждениями?

Возможно, что members.GetRoleByName (rolename) извлекает роль из карты идентификации.

0 голосов
/ 08 сентября 2010

Я выяснил, что происходит с двунаправленными отношениями. Когда роль добавляется в коллекцию ролей, пользователь NH не создает другую сторону отношений. Самый простой способ заставить NH сделать двунаправленное - это либо очистить сессию IS, либо выселить две сущности (мое предпочтение). Это заставляет NH получить доступ к базе данных и правильно построить обе стороны отношений. то есть newUser.Roles [0] содержит добавленную роль, а newRole.Users [0] содержит пользователя - как я и хотел.

Я также обнаружил, что у моего тестового жгута была ошибка и создавались две разные сессии: - (

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