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

Entity framework 4 实体框架多对多查询:未生成导航属性,entity-framework-4,Entity Framework 4,我有两个表User和UserRole,它们通过链接表UserInRole 当我生成实体模型时,由于某种原因,实体UserInRole没有生成。从图中可以看出,实体框架了解到用户和用户角色之间存在多对多关系: 我需要像这样实现查询 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

我有两个表
User
UserRole
,它们通过链接表
UserInRole

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

我需要像这样实现查询

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
// 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();

获取错误
无法将类型“System.Collections.Generic.List”隐式转换为“string[]”
有什么想法吗

您的EF模型中不需要该链接表!这就是英孚的魅力所在

检查您的实体
User
-它有一个
UserRoles
导航属性-这是该用户所处的所有角色的集合

签出实体
UserRole
:它有一个导航属性
Users
,其中包含此角色中的所有用户

使用这两个多值导航属性,您可以表达您可能需要的任何查询:

  • 查找给定角色的所有用户(查找
    UserRole
    实体并枚举其
    .users
    属性)
  • 查找给定用户的所有角色(查找
    用户
    并枚举其
    .UserRoles
EF和EDM有点“隐藏”链接表——当你在概念模型中表达你的意图时,你并不真的需要它;这些链接表只是关系数据库中的一个“必要的恶魔”,因为这些数据库不能以任何其他方式对m:n关系建模

更新:因此,您似乎希望找到特定用户所处的所有用户角色(其名称)的列表-您可以这样表示:

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
// 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();

是的,我看到了这些属性,我想这是一种神奇的东西。。。在出现意外混乱后,试图找出查询。您的问题是:更新部分中的第一个select将选择一个用户列表-其中是否包含一个或多个用户并不相关,但它是一个用户列表-并从中选择其用户角色的名称-因此您有一个数组列表,基本上,这就是错误告诉你的。