我在表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')
因此它不会为我生成主键
很多人
答案 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]