【问题标题】:Entity Framework and roles实体框架和角色
【发布时间】:2014-11-05 19:45:22
【问题描述】:

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

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 上为 Roles 和 Users 表设置了外键列。

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

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

映射的一切工作。 现在我真正想要的是 User 类有一个 Roles 列表,而不是 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();
    }
}

我相信您可以在这里看到问题。 有人能想出一个解决方案,让我的表结构保持不变,但我可以访问 Roles 而不是 UserRoles?

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

【问题讨论】:

    标签: c# entity-framework


    【解决方案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;}
    }
    

    【讨论】:

    • 我不应该在这里创建另一个表,我必须做一些事情来让模型访问角色而不是用户角色。
    • 此答案仅使用您已有的三个表。事实上,你的 dbContext 中只有用户和角色,用户角色表存在于数据库中只是为了提供它们之间的映射。
    【解决方案2】:

    我认为这个问题的答案只是将 Role 添加到 UserRole 类中,如下所示:

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

    这将使我能够访问角色。

    【讨论】:

    • 根本不需要 UserRole 类。
    • 好的,现在你已经更新了你的答案,我明白你的意思了。但是,如果我想将用户添加到角色中,我不需要这个 UserRole 类吗?
    • 不,只需将用户添加到 Role 类上的 users 集合中,或者将角色添加到 User 类上的角色集合中,保存更改,EF 会将行添加到 UserRole 表中并更新集合,使它们都正确。
    【解决方案3】:

    你遵循什么方法。?首先是代码/模型/数据库。我认为您不需要 UserRole 类。在 Role 和 User 中拥有集合就足够了,并且 EntityFramework 足够聪明,可以确定您有一个多对多的 RelationShip,因此它将创建在数据库中加入表,但会以如下代码公开它: User.Roles.Add(Role arole) 和 Role.Users.Add(User auser)。

    希望有帮助

    编辑:OOOps。在我之前回答了相同的答案..我没有看到它。

    【讨论】:

      猜你喜欢
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多