使用BreezeJS与ASP.. NET Identity多对多用户角色表



我正在尝试使用Entity Framework, BreezeJSAngularJS来实现ASP.NET Identity。我在ASP中使用的方法。. NET Identity在这里。一对多关系,如Users - UserLoginsUsers - UserClaims就可以;Breeze在一个调用中返回它们,没有任何问题。问题在于SQL中的UserRoles表与连接表(UserUserRoles)一起存在,这是EntityFramework中Breeze目前不支持的多对多关系。

EF设计器自动连接UserUserRoles表与关联'桥',这实际上是'UserUserRoles'表没有一个可见的表,只是连接器/关联线。我尝试重新安排模型,在UsersUserUserRoles以及UserRolesUserUserRoles之间创建两个一对多的关系,认为Breeze会接受它们。但是,到目前为止,它还没有起作用(它对我基于linq的WebApi控制器造成了严重破坏,我还没有克服这些错误)。

我已经审查了以下link/Plunkr,作为在客户机上使用map处理m2m关系的一种方法。它看起来很有希望,但我试图了解如何查询ASP。NET Identity EF数据模型实现此方法。或者,这种方法可能不适合ASP。净的身份。为此,有人能解释一下EF模型和Breeze EntityManager调用必须是什么样子才能实现ASP的工作(甚至是伪工作)关系吗?. NET身份,特别是 UserRoles 关系?

顺便说一句,我没有完全致力于EF数据模型和第一个链接中的SQL表配置。这只是我一开始觉得有意义的东西。如果有一种更好的方法可以放弃用户和用户角色之间的m2m关系,我完全赞成。然而,不能在Breeze中查询m2m数据的潜在问题仍然存在。

见下面的可能的解决方案…

我发现,通过在 UserUserRoles 连接表中添加第三列,例如自动递增的标识(int)列——一个最初有2列都是外键的表, EntityFramework 不再将连接视为多对多关系,而是两个1对多关系。通过这种方式,我的Breeze查询,之前为UserRoles提取空结果,现在包含UserUserRoles(连接表数据)字段,随后包含相关的UserRoles数据。所以,用微风来查询ASP。NET Identity角色有一个可能的解决方案。我不知道这是不是最好的做事方式,但对我来说似乎相当合理。只有进一步的测试才能证明正确与否。

下面是我最后写的代码:
var serviceAddress = "../../breeze/identity",
    em = new breeze.EntityManager({
    serviceName: serviceAddress,
});
// Supply username and password as predicates for authentication
var userPredicate = breeze.Predicate.create('userName', 'eq', username);
var passwordPredicate = breeze.Predicate.create('passwordHash', 'eq', password);
var query = new breeze.EntityQuery('Users')
            .where(userPredicate.and(passwordPredicate));
var promise = em.executeQuery(query)
            .catch(queryFailed);
promise.then(function(result) {
        console.log('breeze authentication result', result);
        //jQuery iteration to test results
        var activeRoles = [];
        $.each(result.results[0].userUserRoles, function(i, val){
            activeRoles.push(userRole.userRole.name);
        });
        console.log('active roles', activeRoles);
        //result => ['Administrator', 'Executive']
})
.catch(function(error) {
        console.log('breeze authentication error', error);
 });
function queryFailed(error) {
        return q.reject(error); // so downstream promise users know it failed
}

在我的微风WebApi控制器的幕后,关键是查询相关的UserRoles数据,像这样:

[HttpGet]
public IQueryable<User> Users()
{
    var users = _contextProvider.Context.Users
        .Include(u => u.UserLogins)
        .Include(u => u.UserUserRoles.Select(r => r.UserRole))
        .Include(u => u.UserClaims);
    return users;
 }

我仍然想知道是否有一种更标准化的方式使用微风与ASP。NET Identity,以及更尖锐的 EntityFramework 多对多关系。如果有人有任何建议,请发表答案/评论,以帮助每个人遇到这个问题。

相关内容

  • 没有找到相关文章

最新更新