我正在尝试使用Entity Framework
, BreezeJS
和AngularJS
来实现ASP.NET Identity
。我在ASP中使用的方法。. NET Identity在这里。一对多关系,如Users
- UserLogins
、Users
- UserClaims
就可以;Breeze在一个调用中返回它们,没有任何问题。问题在于SQL中的UserRoles
表与连接表(UserUserRoles
)一起存在,这是EntityFramework中Breeze目前不支持的多对多关系。
EF设计器自动连接User
和UserRoles
表与关联'桥',这实际上是'UserUserRoles'表没有一个可见的表,只是连接器/关联线。我尝试重新安排模型,在Users
和UserUserRoles
以及UserRoles
和UserUserRoles
之间创建两个一对多的关系,认为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
多对多关系。如果有人有任何建议,请发表答案/评论,以帮助每个人遇到这个问题。