我正在尝试使用ASP.NET Identity
,Entity Framework
和BreezeJS
来实施AngularJS
。我用于ASP.NET身份的方法是here。一对多关系,例如Users
- UserLogins
和Users
- UserClaims
可以正常工作; Breeze在一次通话中返回它们,没有问题。问题在于SQL中的UserRoles
表存在连接表(UserUserRoles
),这是Breeze目前不支持的EntityFramework中的多对多关系。
EF设计器自动将User
和UserRoles
表与一个关联“桥”连接起来,这实际上是没有可见表的“UserUserRoles”表,只是连接符/关联线。我尝试重新排列模型,在Users
和UserUserRoles
以及UserRoles
和UserUserRoles
之间创建两个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数据的根本问题仍然存在。
看下面可能的解决方案......
答案 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
多对多关系即可。如果有人有任何建议,请发布答案/评论,以帮助每个人遇到此问题。