nhibernate 中的多对多关系

Many-to-many relationships in nhibernate

我在 tables 用户和角色之间建立了一个简单的多对多关系,使用 UserRole table 作为关系之一。 所以,它看起来像这样: User->one-to-many-> UserRole <-many-to-one<-Role

User.cs:

public class User
{
    public User()
    {
        Roles = new List<Role>();
    }
    public virtual int UserId { get; set; }
    public virtual string UserName { get; set; }
    public virtual IList<Role> Roles { get; set; }
} 

Role.cs:

public class Role
{
    public virtual Guid RoleId { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<User> Users { get; set; }
}

用户Role.cs:

public class UserRole
{
    public virtual Guid UserRoleId { get; set; }
    public virtual int CommonUserId { get; set; }
    public virtual Guid RoleId { get; set; }
}

UserMap.cs:

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.UserId).GeneratedBy.Identity();
        Map(x => x.UserName);
        HasManyToMany(x => x.Roles)
            .Cascade.None()
            .Reverse()
            .Table("UserRole")
            .ParentKeyColumn("UserId")
            .ChildKeyColumn("RoleId");
    }
}

RoleMap.cs

class RoleMap : ClassMap<Role>
{
    public RoleMap()
    {
        Id(x => x.RoleId).GeneratedBy.GuidComb();
        Map(x => x.Name);
        HasManyToMany(x => x.Users)
            .Cascade.None()
            .Table("UserRole")
            .ParentKeyColumn("RoleId")
            .ChildKeyColumn("UserId");
    }
}

用户RoleMap.cs:

public class UserRoleMap : ClassMap<UserRole>
{
    public UserMap()
    {
        Id(x => x.UserRole).GeneratedBy.GuidComb();
    }
}

我的问题是: 在 NHibernate 中是否有可能从数据库中获取用户,将角色添加到它的集合中并保存。我知道我可以使用 UserRole table 来做到这一点,只需添加/删除关联, 但是如果不在我的代码中使用 UserRole class 是否可以做同样的事情(我的意思是在 BL 中)?

基本上,如果我想为用户添加角色,我可以将它们添加到他的集合中并保存,而不是通过手动操作 UserRole 吗? 此外,UserRole 应该有 GuidComb 键,但是当我尝试添加角色时 - 它抛出一个异常,即 UserRoleId 不能为空并且探查器显示

INSERT INTO UserRole
(UserId, RoleId)
VALUES
(1, 'some-guid-here')

所以它不会为我生成主键

比x多

我不必创建 UserRole class。 NHibernate 确保关联 table.

型号

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

    public virtual int UserId { get; set; }

    public virtual string UserName { get; set; }

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

public class Role
{
    public virtual Guid RoleId { get; set; }

    public virtual string Name { get; set; }

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

映射

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.UserId).GeneratedBy.Identity();
        Map(x => x.UserName);
        HasManyToMany(x => x.Roles)
           .Cascade.All()
           .Table("UserRoles");
    }
}

public class RoleMap : ClassMap<Role>
{
    public RoleMap()
    {
        Id(x => x.RoleId).GeneratedBy.GuidComb();
        Map(x => x.Name);
        HasManyToMany(x => x.Users)
           .Cascade.All()
           .Inverse()
           .Table("UserRoles");
    }
}

由 NHibernatesql 生成

create table [Role] (RoleId UNIQUEIDENTIFIER not null, Name NVARCHAR(255) null, primary key (RoleId))
create table UserRoles (Role_id UNIQUEIDENTIFIER not null, User_id INT not null)
create table [User] (UserId INT IDENTITY NOT NULL, UserName NVARCHAR(255) null, primary key (UserId))
alter table UserRoles add constraint FK_UserRoles_User foreign key (User_id) references [User]
alter table UserRoles add constraint FK_UserRoles_Role foreign key (Role_id) references [Role]