【问题标题】:Many-to-many relationships in nhibernatenhibernate中的多对多关系
【发布时间】:2016-03-23 18:03:56
【问题描述】:

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

用户.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; }
} 

角色.cs:

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

用户角色.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");
    }
}

角色映射.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");
    }
}

用户角色映射.cs:

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

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

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

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

所以它不会为我生成主键

非常感谢

【问题讨论】:

    标签: c# nhibernate many-to-many


    【解决方案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]
    

    【讨论】:

    • 感谢您的回答,但是如果我想在关系表中添加一些额外的列怎么办?比如我想添加 CreatedDate?
    • @AlexOvechkin 在这种情况下,它不再是一个纯粹的关联表。如果你想通过代码来处理,你应该坚持你的问题实现。 (但奇怪的是UserRole id 没有生成,它应该像任何其他实体一样工作。)否则请参阅此related question
    猜你喜欢
    • 2011-03-16
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2012-06-05
    • 2012-06-12
    • 1970-01-01
    相关资源
    最近更新 更多