我使用带有Identity 2的ASP.NET MVC5来创建公司,用户和角色的关系。
以下是Company和UserProfile的模型(从IdentityUser扩展):
public class Company
{
[Key]
[DataMember]
public Guid CompanyId { get; set; }
[StringLength(100)]
[DataMember]
public string Name { get; set; }
[DataMember]
public virtual ICollection<UserProfile> Staff { get; set; }
}
[DataContract(IsReference = true)]
public class UserProfile : IdentityUser
{
[DataMember]
public Guid CompanyId { get; set; }
[ForeignKey("CompanyId")]
[DataMember]
public virtual Company Company { get; set; }
}
由于它是一对多关系,我在我的存储库clas中获得了以下代码的所有公司列表:
public override IQueryable<Company> All()
{
return this.Context.Set<Company>().Include(s => s.Staff.Select(r => r.Roles));
}
当我以JSON格式将此数据返回给客户端时,我需要使用以下ViewModel对其进行建模:
public class CustomerViewModel
{
public string Id { get; set; }
public string CompanyName { get; set; }
public string OwnerEmail { get; set; }
public int StaffCount { get; set; }
}
以下是我如何将存储库中的值映射到视图模型:
var all = UOW.CompanyRepository.All()
if (all != null)
{
return Ok(all.Select(d => new CustomerViewModel { Id = d.CompanyId.ToString(), CompanyName = d.Name, OwnerEmail = "owner@mycompany.com", StaffCount = d.Staff.Count() }).ToList());
}
“所有者”是指每个公司中只有一个用户/员工的角色。 我现在的问题是,如何获得“所有者”电子邮件?
答案 0 :(得分:0)
我经常与ASP.NET Identity同时查询用户和角色。 我的解决方法是定义一个具有用户和角色的类。
示例:
<script src="lib/ionic/js/ionic.bundle.js"></script>
<!-- inject:js -->
<script src="lib/node_modules/ng-cordova/dist/ng-cordova-mocks.min.js"></script>
<script src="lib/node_modules/ng-cordova/dist/ng-cordova.min.js"></script>
<script src="lib/node_modules/ng-cordova/src/plugins/device.js"></script>
<script src="lib/node_modules/ng-cordova/src/plugins/file.js"></script>
<!-- endinject -->
然后,您的存储库中的查询将这些值组合在一起:
<!-- inject:js -->
<script src="lib/node_modules/ng-cordova/dist/ng-cordova-mocks.min.js"></script>
<script src="lib/node_modules/ng-cordova/dist/ng-cordova.min.js"></script>
<script src="lib/node_modules/ng-cordova/src/plugins/device.js"></script>
<script src="lib/node_modules/ng-cordova/src/plugins/file.js"></script>
<!-- endinject -->
<script src="lib/ionic/js/ionic.bundle.js"></script>
然后,如果您想要获得具有“所有者”角色的用户电子邮件,它将如下所示:
public class UserRole
{
public IdentityUser User { get; set; }
public IdentityRole Role { get; set; }
}
这适用于具有单一角色的用户。
如果您为每个用户方案使用多个角色,则必须更改public IQueryable<UserRole> GetUsers()
{
var userQuery = (from usr in context.Users
let userRole = usr.Roles.FirstOrDefault()
join role in context.Roles on userRole.RoleId equals role.Id
select new UserRole()
{
User = usr,
Role = role
});
return userQuery;
}
类以使角色具有var emails = GetUsers().Where(ur => ur.Role.Name == "Owner").Select(ur => ur.User.Email);
,并在查询中使用UserRole
进行联接然后由用户对角色进行分组,因此查询应如下所示:
IQueryable<IdentityRole>