首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架和角色

实体框架和角色
EN

Stack Overflow用户
提问于 2014-11-05 11:24:18
回答 3查看 2.2K关注 0票数 1

我有个问题。我有一个用户,它可以有多个角色,但是角色是全局的,所以我已经设置了如下表结构:

代码语言:javascript
复制
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列上为角色User表设置了foriegn键。

在我的代码中,我有这样一个:

代码语言:javascript
复制
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对这个类和我的映射都很好,如下所示:

代码语言:javascript
复制
modelBuilder.Entity<UserRole>().HasKey(m => new { m.UserId, m.RoleId });

地图上的一切都能用。现在我真正想要的是,用户类有一个角色的列表,而不是UserRoles

所以,我希望它看起来像这样:

代码语言:javascript
复制
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

如果我的解释不太好,很抱歉。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-05 11:27:42

我觉得你想要的是这样的..。

在DbContext中:

代码语言:javascript
复制
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");
                });
}

现在你有了。

代码语言:javascript
复制
class User
{
   ICollection<Role> roles {get; set;}
}

代码语言:javascript
复制
class Role
{
    ICollection<User> users {get; set;}
}
票数 1
EN

Stack Overflow用户

发布于 2014-11-05 11:34:35

我认为解决这一问题的方法是将角色添加到UserRole类中,如下所示:

代码语言:javascript
复制
public class UserRole
{
    public string RoleId { get; set; }
    public string UserId { get; set; }

    public Role Role { get; set; }
}

这样我就可以访问角色了。

票数 0
EN

Stack Overflow用户

发布于 2014-11-05 11:45:22

你遵循的是什么方法?首先,代码/模型/数据库,我认为您不需要类UserRole.having集合的角色和用户是足够的,而EntityFramework足够聪明地找出您有一个多到多的RelationShip,所以它将在数据库中创建连接表,但将以如下代码公开它:User.Roles.Add(角色)和Role.Users.Add(用户用户)。

希望能帮上忙

编辑: OOOps.同样的答案在我之前得到了回答,..i没有看到。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26756022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档