实体框架和角色

时间:2014-11-05 11:24:18

标签: c# entity-framework

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

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 吗?

对不起,如果我的解释不好。

3 个答案:

答案 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。在我面前回答了同样的答案..我没有看到它。