实体框架多对多查询:未生成导航属性

时间:2011-05-01 08:10:03

标签: entity-framework-4

我有两个表UserUserRole,它们是使用链接表UserInRole

连接的

当我生成实体模型时,由于某种原因,实体UserInRole没有生成。从图中可以看出,实体框架理解UserUserRole之间存在多对多关系:

enter image description here

我需要像这样实现查询

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实体,所以在这种情况下我应该怎么做?我应该删除UserInRoleUserRole之间的链接以获取模型中生成的实体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[]'任何想法?

1 个答案:

答案 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();