我有两个表User
和UserRole
,它们是使用链接表UserInRole
当我生成实体模型时,由于某种原因,实体UserInRole
没有生成。从图中可以看出,实体框架理解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
但实体框架不会生成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[]'
任何想法?
答案 0 :(得分:8)
您的EF模型中不需要该链接表!这就是EF的美丽!
检查您的实体User
- 它有一个UserRoles
导航属性 - 这是该用户所有角色的集合。
签出实体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();