我有两个表User
和UserRole
,它们使用链接表UserInRole
连接
当我生成实体模型时,由于某种原因,实体UserInRole
没有生成。从图中可以看出,Entity Framework理解User
和UserRole
之间存在多对多关系:
我需要像这样实现查询
select ur.Name from [User] as u
inner join UserInRole uir on uir.UserId = u.Id
inner join UserRole ur on ur.Id = uir.UserRoleId
where u.Username = 'magename'
我正在使用通用存储库,如果导航属性将存在,则查询将如下所示:
from u in repository.AsQueryable<User>()
join uir in repository.AsQueryable<UserInRole>() on u.Id equals uir.UserId
join ur in repository.AsQueryable<UserRole>() on uir.UserId equals ur.Id
where u.Username == userName
select ur.Name
但是, Entity Framework 不会生成
UserInRoles
导航属性和相关的UserInRole
实体,因此问题是在那种情况下我该怎么办?我是否应该删除UserInRole
和UserRole
之间的链接以获取在模型中生成的实体UserInRole
,或者有什么方法可以使我上面描述的查询没有对数据库进行任何更改?更新
所以看起来我需要做这样的事情
stirng[] roles = (from u in repository.AsQueryable<User>()
where u.Username == userName
select ur.UserRoles.Select(x => x.Name)).ToArray<string>();
得到一个错误
Cannot implicitly convert type 'System.Collections.Generic.List<System.Collections.Generic.IEnumerable<string>>' to 'string[]'
任何想法? 最佳答案
您的EF模型中不需要该链接表!那就是EF的美丽!
检查您的实体User
-它具有UserRoles
导航属性-这是该用户所在的所有角色的集合。
checkout 实体UserRole
:它具有导航属性Users
,该属性具有处于该角色的所有用户。
使用这两个多值导航属性,您可以表达您可能想要的任何查询:
UserRole
实体并枚举其.Users
属性)User
并枚举其.UserRoles
)EF和EDM会“隐藏”链接到您的表-在概念模型中表达意图时,您实际上并不需要它。这些链接表只是关系数据库中的“必不可少的恶魔”,因为这些数据库不能以任何其他方式对m:n关系进行建模。
更新:,因此您似乎想要查找特定用户所在的所有用户角色(其名称)的列表-您可以这样表示:
// find the user in your "dbContext" (or via your repository)
var user = _dbContext.Users.FirstOrDefault(u => u.Name == "magename");
// from the list of UserRoles on that user, select the names only
var userRolesNames = user.UserRoles.Select(ur => ur.Name).ToList();