我有一个问题。我有一个用户,可以有很多角色,但角色是全局的,所以我设置了一个表结构如下:
CREATE TABLE [dbo].[Users](
[Id] [nvarchar](128) NOT NULL,
[UserName] [nvarchar](max) NULL,
[Email] [nvarchar](max) NULL,
[DateCreated] [datetime] NOT NULL,
[DateModified] [datetime] NULL,
[LastLoginDate] [datetime] NOT NULL,
[PasswordHash] [nvarchar](max) NULL,
CONSTRAINT [PK_dbo.Users] PRIMARY KEY CLUSTERED
CREATE TABLE [dbo].[UserRoles](
[UserId] [nvarchar](128) NOT NULL,
[RoleId] [nvarchar](128) NOT NULL,
CONSTRAINT [PK_dbo.UserRoles] PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[RoleId] ASC
)
CREATE TABLE [dbo].[Roles](
[Id] [nvarchar](128) NOT NULL,
[Name] [nvarchar](max) NULL,
CONSTRAINT [PK_dbo.Roles] PRIMARY KEY CLUSTERED
(
[Id] ASC
)
UserRoles 表格为相应的 ID 上的角色和用户表设置了foriegn键列。
在我的代码中,我有这个:
public class User : IUser
{
public string Id { get; set; }
// Stripped for brevity
public IList<UserRole> Roles { get; set; }
public User()
{
this.Id = Guid.NewGuid().ToString();
}
}
public class UserRole
{
public string RoleId { get; set; }
public string UserId { get; set; }
}
public class Role : IRole
{
public string Id { get; set; }
public string Name { get; set; }
public IList<UserRole> Users { get; set; }
public Role()
{
this.Id = Guid.NewGuid().ToString();
}
}
EntityFramework 可以使用此类并使用我的映射,如下所示:
modelBuilder.Entity<UserRole>().HasKey(m => new { m.UserId, m.RoleId });
映射的一切都有效。 现在我真正想要的是,用户类列出角色而不是 UserRoles 。
所以,我希望它看起来像这样:
public class User : IUser
{
public string Id { get; set; }
// Stripped for brevity
public IList<Role> Roles { get; set; }
public User()
{
this.Id = Guid.NewGuid().ToString();
}
}
我相信你可以在这里看到问题。 有人可以想到我的表结构保持不变的解决方案,但我可以访问角色而不是 UserRoles 吗?
对不起,如果我的解释不好。
答案 0 :(得分:1)
我认为你是这样的......
在DbContext中:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany(x => x.roles)
.WithMany(x => x.users)
.Map(x =>
{
x.MapLeftKey("userId");
x.MapRightKey("roleId");
x.ToTable("UserRole");
});
}
现在你有了。
class User
{
ICollection<Role> roles {get; set;}
}
和
class Role
{
ICollection<User> users {get; set;}
}
答案 1 :(得分:0)
我认为答案就是将角色添加到 UserRole 类,如下所示:
public class UserRole
{
public string RoleId { get; set; }
public string UserId { get; set; }
public Role Role { get; set; }
}
这样我就可以访问角色。
答案 2 :(得分:0)
您遵循什么方法?首先是代码/模型/数据库。我认为你不需要在Role和User中使用类UserRole.having集合就足够了,EntityFramework足够聪明,可以发现你有一个多对多的RelationShip所以它会在数据库中创建连接表,但会在代码中公开它,如下所示: User.Roles.Add(Role arole)和Role.Users.Add(User auser)。
希望这个帮助
编辑:OOOps。在我面前回答了同样的答案..我没有看到它。