【问题标题】:Entity Framework many-to-many query: navigation property not generated实体框架多对多查询:未生成导航属性
【发布时间】:2011-05-01 16:34:31
【问题描述】:

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

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

我需要像这样实现查询

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&lt;System.Collections.Generic.IEnumerable&lt;string&gt;&gt;' to 'string[]' 有什么想法吗?

【问题讨论】:

  • 您的问题是:您的 UPDATED 部分中的第一个选择将选择 用户列表 - 是否包含单个或多个用户不相关,但它是一个 用户列表 - 并从中选择用户角色的名称 - 所以你有一个数组列表,基本上 - 这就是错误告诉你的内容。

标签: entity-framework-4


【解决方案1】:

您的 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();

【讨论】:

  • 是的,我看到了这些属性,我认为这是某种 EF 魔法……在出现意外混乱后试图找出查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多