【问题标题】:in relation many to many is included a lot of objects在多对多关系中包含很多对象
【发布时间】:2013-06-19 01:45:29
【问题描述】:

我的数据库中的两个表之间存在多对多关系,因此在我的 edmx 模型中我只有两个表,没有中间表。此表是电影和流派。

当我搜索一些电影时,我也会获得相关的实体,因此通过预先加载,我会填充我的实体 Movies 的集合流派。是我想要的。

问题在于,当结果中有多个电影时,实体 MOvies 的集合 Genres 被填充,而且实体 Genres 的集合 Movies 也被填充。因此,当我将要更新的电影发送到存储库时,如果我将实体附加到上下文,我会附加这部电影以及与我要更新的电影具有相同类型的所有电影。这是因为在实体的类型中包含与我要更新的电影类型相同的电影。

因此,如果在我的第一次搜索中我得到很多电影,当我想更新一部电影时,我会发送很多我不需要播种的实体,因此网络中的流量很大。

当我搜索结果时,有什么方法不会填充流派实体中的电影集合?因为我只填充我的主要实体电影的相关实体,而不是全部。

我正在使用 SQLite 和 EF 4.4;我试图找到 mergeOption 来禁用流派的跟踪,但我没有找到。

谢谢。

【问题讨论】:

  • "我发送了很多实体"..."网络流量很大": 你在哪里发送实体到网络上的流量是什么?在 EF 客户端和数据库之间根本不发送任何实体,只发送 SQL 语句和列/行数据。无论是否填充反向导航属性,这些数据的数量都不会改变。或者您的意思是使用 "network" 将实体图移动到(Web)服务边界或类似的东西上?

标签: c# entity-framework-4 sqlite


【解决方案1】:

在设计实体和关系(逻辑设计)时,可以描述两个实体之间的多对多关系。当你需要在一个数据库中实现这些实体及其关系时(物理设计),你不能只用两张表来做;你真的需要一个中间表来表达这种关系。

两个实体之间的一对多关系只需要每个实体的表(简单外键关系)。因此,如果您的流派表只是给定电影的流派列表,那么它将是一对多的(电影作为父级,流派作为子级);那会工作的。

但是,由于您已将流派描述为与电影存在多对多关系,因此这表明流派用于提供一种“选择列表”,即流派中的一行与电影无关电影中的任何特定行,但可以与任何电影相关(反之亦然)。为了使这种关系起作用,您需要一个中间表,我们称之为“moviegenres”,它只需要包含两列——一个与电影主键相关的外键,以及一个与流派主键相关的外键。该表实际上表达了您的多对多关系,然后通过向“moviegenres”添加行来为电影分配流派。

在考虑数据填充方式的任何问题之前,您需要先解决逻辑到物理的设计问题。

【讨论】:

  • 是的,在我的数据库中,我有三个表,其中提到的两个表和 moviesgenres 作为中间表,只有两个表的 FK。所以当我只有两个实体,电影和流派,但没有电影流派。我在电影实体中有一个类型的集合,反之亦然。问题是 EF 在执行查询时会填充所有集合。 EF 填充电影中的流派集合,并且流派填充电影集合。所以一部电影有一系列流派,其中有电影和电影的集合。所以当我只想更新一个时,我会发送很多实体。
猜你喜欢
  • 1970-01-01
  • 2016-11-03
  • 2014-12-03
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
相关资源
最近更新 更多