我正在开发具有授权的新Asp.Net Core API。 在我的授权中,用户可以具有多个角色。当然,一个角色可以有多个用户。
这是我的课程:
public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public ICollection<UserRole> Roles { get; set; }
[NotMapped]
public string Token { get; set; }
}
public class UserRole
{
[JsonIgnore]
public Guid UserId { get; set; }
public User User { get; set; }
public int RoleId { get; set; }
public Role Role { get; set; }
}
public class Role
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
}
ApplicationDbContext:
modelBuilder.Entity<UserRole>()
.HasKey(bc => new { bc.UserId, bc.RoleId });
modelBuilder.Entity<UserRole>()
.HasOne(bc => bc.User)
.WithMany(b => b.Roles)
.HasForeignKey(bc => bc.UserId);
这一切正常,如果我想要一个用户,我可以得到3级深度的正确输出。但我想摆脱第二层。如果我想要一个用户,我想恢复一对多的关系。为此,我的UserDTO
public class UserDTO
{
public Guid Id { get; set; }
public ICollection<Role> Roles { get; set; }
public string Token { get; set; }
}
注意:集合角色而不是用户角色
但是如何使用Entity Framework Core(3.1)或AutoMapper实现呢?
第二个问题。如果检索单个用户或用户列表,则只能得到2个级别的深度。但是,如果我要求首先检索所有用户角色,则会得到3个级别。但是我有2个电话。这应该是一个。
->这有效
public async Task<IEnumerable<User>> GetAll()
{
var ur = await _context.UserRoles.Include(ur => ur.Role).Include(ur => ur.User).ToListAsync();
var users = await _context.Users
.Include(users => users.Roles)
.ToListAsync();
return users;
}
->这不是
public async Task<IEnumerable<User>> GetAll()
{
var users = await _context.Users
.Include(users => users.Roles)
.ToListAsync();
return users;
}
这些是我的序列化选项:
services.AddControllers().AddNewtonsoftJson(options =>
{
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});