2014-11-05 90 views
1

我遇到问题。我有一个用户它可以有很多角色,但角色是全球性的,所以我成立了一个表结构如下:实体框架和角色

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 
) 

的UserRole表已foriegn键设置对于角色用户表分别对应Id列。

在我的代码,我有这样的:

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 }); 

一切为了映射工作。 现在我真正想要的,是用户类有一个列表角色而不是用户角色

所以,我想它是这样的:

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

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

回答

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;} 
} 
+0

我不应该在这里创建另一个表,我必须做些事情才能使模型有权访问角色而不是UserRole。 – r3plica 2014-11-05 11:29:39

+0

这个答案只使用你已有的三张表。事实上,你只需要在dbContext中拥有用户和角色,UserRole表就存在于数据库中,只是为了提供他们之间的映射。 – 2014-11-05 11:31:04

0

我认为这个问题的答案是刚刚加入角色的UserRole类,像这样:

public class UserRole 
{ 
    public string RoleId { get; set; } 
    public string UserId { get; set; } 

    public Role Role { get; set; } 
} 

这将然后给我访问到角色

+0

完全不需要UserRole类。 – 2014-11-05 11:37:45

+0

好吧,现在你已经更新了你的答案,我可以看到你的意思。如果我想添加一个用户到一个角色,但是我不需要这个UserRole类吗? – r3plica 2014-11-05 21:36:31

+1

不需要,只需将用户添加到Role类的用户集合中,或者将角色添加到User类上的角色集合,保存更改,然后EF将该行添加到UserRole表中并更新集合,使它们都是正确的。 – 2014-11-06 07:22:15

0

你跟随什么方法?代码/模型/数据库first.I认为你不需要角色和用户中的类UserRole.having集合是足够的和EntityFramework足够聪明,找出你有一个多对多的关系,所以它会创建在数据库内连接表,但会暴露在代码中,如下所示: User.Roles.Add(Role arole)和Role.Users.Add(User auser)。

希望这有助于

编辑:哎呀。在我之前回答同样的答案..我没有看到它。