使用BreezeJS与ASP.NET身份多对多UserRoles表

时间:2014-08-21 11:50:12

标签: angularjs entity-framework breeze asp.net-identity

我正在尝试使用ASP.NET IdentityEntity FrameworkBreezeJS来实施AngularJS。我用于ASP.NET身份的方法是here。一对多关系,例如Users - UserLoginsUsers - UserClaims可以正常工作; Breeze在一次通话中返回它们,没有问题。问题在于SQL中的UserRoles表存在连接表(UserUserRoles),这是Breeze目前不支持的EntityFramework中的多对多关系。

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

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

BTW,我没有完全致力于第一个链接中的EF数据模型和SQL表配置。这正是我发现最初有意义的东西。如果有一个更好的方法放弃用户和UserRoles之间的m2m关系,我就是全力以赴。但是,不在Breeze中查询m2m数据的根本问题仍然存在。

看下面可能的解决方案......

1 个答案:

答案 0 :(得分:0)

我发现,通过在 UserUserRoles 连接表中添加第3列,例如自动递增标识(int)列 - 最初有2的表同时是外键的列 EntityFramework 不再将联接视为多对多关系,而是两个1对多关系。通过这种方式,我之前为UserRoles提取空结果的Breeze查询现在包含UserUserRoles(连接表数据)字段,该字段随后包含相关的UserRoles数据。因此,让Breeze查询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
}

在我的Breeze 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;
 }

我仍然想知道是否有更标准化的方式将Breeze与ASP.NET身份一起使用,并且更加尖锐, EntityFramework 多对多关系即可。如果有人有任何建议,请发布答案/评论,以帮助每个人遇到此问题。