- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 EF5,当关系为 1:N 时,如果我想加载相关实体,我将执行以下操作:
使用 T-SQL,我使用 T-SQL 从数据库加载主要实体:
select *
from MainEntities
where ...
我使用 T-SQL 加载相关实体
select *
from RelatedEntities
where IDMainEntity IN (---)
此时 EF 使用相关实体填充主要实体的属性导航。此外,在 dbContext
中每个实体类型的本地属性中,我拥有每种类型的所有实体。
但是,如果我对 N:N 关系做同样的事情,我没有关系中间表的实体,当我执行查询时,我在 dbContext< 的本地
每种类型的实体,但未填充属性导航。
我想知道为什么以及是否存在其他选择。
我使用这种方式是因为我想使用 T-SQL 创建动态查询。如果我使用预先加载,我对动态查询的灵 active 就不如我使用 TSQL 时的灵 active ,而且效率较低。如果我使用显式加载,我会做 N 个额外的查询,主实体结果中的每条记录之一用我的方式,我只需要一个额外的查询,因为我一次获得了所有相关的实体。如果我使用延迟加载,我会遇到同样的问题,N 个额外的查询。
当关系为 N:N 时,为什么 EF 不填充相关属性?
谢谢。
最佳答案
您所谈论的功能称为Relationship Span 或Relationship Fixup 并且实际上 - 正如您所注意到的 - 它不适用于多对多关系。它仅在关联的至少一端具有多重性 1(或 0..1)时才有效,即它适用于一对多或一对一关系。
Relationship Span 依赖于具有外键的实体。它是否具有显式外键属性(外键关联)或只有相应数据库表中的外键列而模型中没有属性(独立关联)都没有关系em>).在这两种情况下,FK 值都将在加载实体时加载到上下文中。基于这个外键值,EF 能够确定与这个 FK 值具有相同主键值的相关实体是否附加到上下文,如果是,它可以“修复关系”,即它可以填充导航属性正确。
现在,在多对多关系中,两个相关实体都没有外键。外键存储在该关系的链接表中,并且如您所知,链接表没有相应的模型实体。因此,永远不会加载外键,因此上下文无法确定哪些附加实体是相关的,也无法修复多对多关系并填充导航集合。
EF 将支持您在多对多关系中使用填充的导航集合构建正确的对象图的唯一 LINQ 查询是预加载...
var user = context.Users.Include(u => u.Roles).First();
...或延迟加载...
var user = context.Users.First();
var rolesCount = user.Roles.Count();
// Calling Count() or any other method on the Roles collection will fill
// user.Roles via lazy loading (if lazy loading is enabled of course)
...或将结果直接分配给导航集合的显式加载:
var user = context.Users.First();
user.Roles = context.Entry(user).Collection(u => u.Roles).Query().ToList();
加载相关实体的所有其他方式 - 如投影、直接 SQL 语句甚至显式加载而不分配给导航集合,即使用 .Load()
而不是 .Query().ToList()
在上面的最后一个代码片段中 - 不会修复关系并将导航集合留空。
如果您打算主要执行 SQL 查询而不是 LINQ 查询,我能看到的唯一选择是您编写自己的关系管理。除了两个相关实体的表之外,您还必须查询链接表。您可能需要一个辅助类型(不是实体)和包含链接表的两个 FK 列值的集合,还可能需要一个辅助例程,它通过检查您找到的实体的主键值来填充导航集合附在DbSet<T>.Local
集合和助手集合中的 FK 值。
关于c# - 如何在 N :N relationship? 中手动加载相关实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20919303/
我有这样的结构: class User(DeclarativeBase): ... teamMemberships = orm.relationship("TeamXREF",backre
我需要提取值 11,12 和 1,即 = 之后的值。 我正在尝试执行以下操作 Matcher m = Pattern.compile("\\((.*?)\\)").matcher(s); while
有三个表/模型: 客户: id - 客户端 品牌: id - 品牌 品牌型号: id - 型号 - Brand_id 品牌模型客户: id - Brandmodel_id - client_id 我希
在我的应用程序核心数据模型中,我有工作表和文本实体。工作表实体可以有两个文本:privacyNotes 和 termsOfUse。 都是文本类型。因此,在 XCode 数据建模器中,我在带有文本目标的
在现有的网络应用程序 (PHP/MySQL) 上工作,我得出了这一点:我有 2 个表存储名称和类型 ID。它们之间的关系是 NN 我之间有另一个表。 (见图) 我有一个名为“category”的最后一
当我创建一对一关系迁移时,laravel 创建一对多关系。 PHP 7.1 和 MySQL 5.7 模型是:角色和用户。 角色: public function user() { return
我有一个巨大的痛苦的继承表,其中包含几百万条记录,我无法有效地查询。表格看起来有点像这样: id | submissionId | key | value ------------------
我有两个实体,相册和照片,它们之间存在多对多关系。一切正常。我想要的是添加一个关系属性,即除了 album_id 和 photo_id 之外的映射的额外属性,例如添加照片的日期时间或表明照片在该相册中
过去几天我一直在努力解决我的问题,遗憾的是没有任何结果。我已经在这里阅读了无数关于这个主题的帖子,但我一直遇到同样的错误。 “'字段列表'中的未知列'Extent1.foo_id'”......我做错
我正在尝试映射两个实体之间的多对多关系,但我需要使用多个属性来装饰该实体 - 请参见下图: Reads 是我在这种情况下的关系表 - 我在上面添加了一个标识列以避免使用复合键,但这里有值(value)
我正在使用 Spring Data/Neo4j 和 REST API 开发一个 Web 应用程序。 我想知道我是否可以创建一种关系并以另一种关系结束,如下所示: @RelationshipEntity
您好,我在进行 Laravel 查询时遇到问题 模型区域 class Region extends Model { protected $table = 'regions'; prot
考虑以下场景: 我的 Laravel 应用程序中有几个实体,如下所示: 发布 页面 图片 视频 以上所有实体都可以有CustomFieldValue,这是另一个实体。 custom_field_val
乍一看,它们似乎在做同样的事情:定义一对多关系 那么你为什么要选择一个或另一个? 最佳答案 EmbedsMany - 嵌入另一个模型的许多实例的模型;例如,一个客户可以有多个电子邮件地址,每个电子邮件
我是 Neo4j 的新手,只是为了深入学习。我有一个小小的疑问,例如, 如果我在空间中创建了两个节点并提供了这两个节点之间的关系以及系统时间(知道它们在什么时间成为 friend )。 所以现在我的问
我想知道是否有人可以帮助我。 这就是我需要做的:将语言表的 ID 拉入新表中,并使其之间具有唯一的关系。就像节点的公式 n(n-1) 一样。 我尝试使用笛卡尔积,但它不起作用,因为列 a = 1 和列
如何识别关系是三元关系还是聚合关系? 例如:一名球员在他参加的比赛中获得奖励。如果实体是玩家、比赛和奖励,这是三元还是聚合? 最佳答案 一个讲师给我的答案,它是一个三元关系,因为涉及到 3 个贡献实体
实体关系是否有标准(非图形)表示法? 现在我正在使用我自己的 janky 符号: 用户 >> 照片, (1-many) 用户 > 个人资料,(1-1 hasOne) 个人资料 标签,(多对多) 最佳
假设有两个实体,名为 Employee 和 Campaign。一名员工可以参与多个事件。一个事件可以有很多员工。我已经知道这是一个多对多的关系。 绘制ER图时(用陈符号),这种关系用菱形来表示。但是对
以下ER图中的双线是表示完全参与还是递归关系? 谁能告诉我两者的符号区别? 最佳答案 总参与人数:集合中的每个实体都涉及关系的某个关联(或元组)。 递归关系:与自身相关的实体集。 在递归关系中最常见的
我是一名优秀的程序员,十分优秀!