我有个问题。我有一个用户,它可以有多个角色,但是角色是全局的,所以我已经设置了如下表结构:
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键。
在我的代码中,我有这样一个:
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。
如果我的解释不太好,很抱歉。
发布于 2014-11-05 11:27:42
我觉得你想要的是这样的..。
在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;}
}发布于 2014-11-05 11:34:35
我认为解决这一问题的方法是将角色添加到UserRole类中,如下所示:
public class UserRole
{
public string RoleId { get; set; }
public string UserId { get; set; }
public Role Role { get; set; }
}这样我就可以访问角色了。
发布于 2014-11-05 11:45:22
你遵循的是什么方法?首先,代码/模型/数据库,我认为您不需要类UserRole.having集合的角色和用户是足够的,而EntityFramework足够聪明地找出您有一个多到多的RelationShip,所以它将在数据库中创建连接表,但将以如下代码公开它:User.Roles.Add(角色)和Role.Users.Add(用户用户)。
希望能帮上忙
编辑: OOOps.同样的答案在我之前得到了回答,..i没有看到。
https://stackoverflow.com/questions/26756022
复制相似问题