nhibernate中的多对多关系

时间:2016-03-23 18:03:56

标签: c# nhibernate many-to-many

我在表User和Role之间有一个简单的多对多关系,使用 UserRole表作为关系之一。 所以,它看起来像这样:用户 - >一对多 - > 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; }
}

UserRole.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");
    }
}

UserRoleMap.cs:

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

我的问题是: 在NHibernate中可以从DB获取用户,在其集合中添加角色并保存。我知道我可以使用UserRole表执行此操作,只需添加/删除分配, 但是如果不在我的代码中使用UserRole类(我的意思是在BL中)可以做同样的事情吗?

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

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

因此它不会为我生成主键

很多人

1 个答案:

答案 0 :(得分:1)

我不必创建UserRole类。 NHibernate确保了关联表。

模型

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");
    }
}

由NHibernate生成的SQL

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]