ASP.NET Identity2 Company-Staff-Roles关系处理

时间:2015-06-15 12:20:59

标签: c# asp.net asp.net-mvc entity-framework asp.net-identity

我使用带有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());
}

“所有者”是指每个公司中只有一个用户/员工的角色。 我现在的问题是,如何获得“所有者”电子邮件?

1 个答案:

答案 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>