Свободная проблема nHibernate во многих сопоставлениях - PullRequest
0 голосов
/ 21 июля 2011

У меня есть интересная проблема, возникающая со мной, я не знаю, что я делаю неправильно, я использую Fluent nHibernate с MVC 3, у меня есть User, Roles и таблица UsersinRole для отношения многих ко многим.

Отображение пользователя:

Id(user => user.UserID).GeneratedBy.Guid();
        Map(user => user.UserName).Not.Nullable();
        Map(user => user.Password).Not.Nullable();
        Map(user => user.FullName).Not.Nullable();
        Map(user => user.Email).Not.Nullable();
        Map(user => user.IsActive).Not.Nullable();
        Map(user => user.CreationDate).Not.Nullable();

        HasManyToMany<Role>(x => x.Roles).Table("tblUserInRoles")
                                            .ParentKeyColumn("UserID")
                                            .ChildKeyColumn("RoleID")
                                            .Cascade.All()
                                            .Not.LazyLoad();

Отображение ролей:

 Id(role => role.RoleID).GeneratedBy.Identity();
        Map(role => role.RoleName).Not.Nullable();
        Map(role => role.IsActive).Not.Nullable();
        Map(role => role.Description).Not.Nullable();

        HasManyToMany<User>(x => x.Users)
            .Table("tblUserInRoles")
            .ParentKeyColumn("RoleID")
            .ChildKeyColumn("UserID")
            .Cascade.SaveUpdate()
            .Inverse()
            .Not.LazyLoad();

Объект пользователя:

public virtual Guid UserID { get; set; }
    public virtual string UserName { get; set; }
    public virtual string Password { get; set; }
    public virtual string FullName { get; set; }
    public virtual string Email { get; set; }
    public virtual TimeSpan LastLogin { get; set; }
    public virtual bool IsActive { get; set; }
    public virtual DateTime CreationDate { get; set; }
    public virtual IList<Role> Roles { get; set; }

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

    }
    public virtual void AddRoles(Role role)
    {
        role.Users.Add(this);
        Roles.Add(role);
    }

Объект роли:

 public virtual string RoleName { get; set; }

    public virtual bool IsActive { get; set; }
    public virtual string Description { get; set; }
    public virtual IList<User> Users { get; set; }
    public virtual IList<Role> Roles { get; set; }

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

Теперь проблема в том, что при удалении любой роли она удаляет ассоциацию ролей с пользователем в таблице UserInRole, а также удаляет всех пользователей, связанных с удаляемой им ролью.то же самое происходит в обратном порядке, если я удаляю пользователя.

Кто-нибудь знает, в чем проблема?

1 Ответ

1 голос
/ 21 июля 2011

Вы указали .Cascade.All() от пользователя к роли, поэтому, конечно, NHibernate удаляет все роли при удалении пользователя. Не используйте .Cascade.All(), если этого не произойдет.

Вы указали .Cascade.SaveUpdate() от роли до пользователя, ни один пользователь не должен быть удален при удалении роли. Вы уверены, что он удаляет пользователей, а не только ассоциации с пользователями?

...