Kun*_*vič 5 entity-framework-4
我有两个表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'
Run Code Online (Sandbox Code Playgroud)
我正在使用通用存储库,如果存在属性,查询将如下所示:
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
Run Code Online (Sandbox Code Playgroud)
但实体框架不会生成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>();
Run Code Online (Sandbox Code Playgroud)
得到Cannot implicitly convert type 'System.Collections.Generic.List<System.Collections.Generic.IEnumerable<string>>' to 'string[]'任何想法的错误?
您的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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5623 次 |
| 最近记录: |