多个映射中的流畅nHibernate问题

时间:2011-07-21 04:55:02

标签: asp.net-mvc nhibernate fluent-nhibernate mapping

我有一个有趣的问题发生在我身上,我不知道我做错了什么,我使用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 个答案:

答案 0 :(得分:1)

您已将用户指定为.Cascade.All(),因此当您删除用户时,NHibernate会删除所有角色。如果不应该发生,请不要使用.Cascade.All()

您从Role to User指定了.Cascade.SaveUpdate(),删除角色时不应删除任何用户。您确定它会删除用户而不仅仅是与用户的关联吗?