2013-06-18 112 views
1

我在我的数据库中的两个表之间有多对多的关系,所以在我的edmx模型中,我只有两个表,没有中间表。这些表是电影和流派。许多对象包括很多对象

当我搜索一些电影时,我也得到了相关的实体,因此在加载时我填充了我的实体电影的集合流派。是我想要的。

问题是,当结果中有多个电影时,实体MOvies的集合流派被填充,而且实体流派的集合电影被填充。因此,当我向存储库发送一个要更新的电影时,如果我将该实体附加到上下文,则附加该电影和所有与我想要更新的电影具有相同类型的电影。这是因为在实体的类型中包含与我想要更新的电影类型相同的电影。

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

有没有什么办法可以在我搜索结果时在流派实体中收集的电影没有填充?因为我只填充主要实体的相关实体,而不是所有的电影。

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

谢谢。

+1

“*我发送了很多实体*”...“*这是网络中的大量流量*”:您在哪里发送**实体到网络上的这些流量?在EF客户端和数据库之间,根本没有实体发送,只有SQL语句和列/行数据。如果填充逆向导航属性,那么这些数据的量不会改变。或者你的意思是用*“network”*来表示你将一个实体图移动到一个(网络)服务边界或类似的东西上? – Slauma

回答

1

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

两个实体之间的一对多关系只需要每个实体的一个表(简单外键关系)。所以,如果你的流派表只是一个给定电影的流派列表,它将是一对多(电影作为父母,流派和孩子一样)。这将工作。

但是,由于您已经将流派描述为与电影之间存在多对多关系,因此它建议使用流派来提供某种“选择列表”,即流派中的一行不相关到电影中的任何特定行,但可能与任何电影相关(反之亦然)。为了使这个关系起作用,你需要一个中间表,我们称它为“moviegenres”,它只需要包含两列 - 一个与电影主键有关的外键和一个与流派主键相关的外键。这个表格实际上是表达你的多对多关系,然后通过向“moviegenres”添加行来实现将类型分配给电影。

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

+0

是的,在我的数据库中,我有三个表格,两个提到了,而moviesgenres作为中间表格,只有两个表格的FK。所以,当我只有两个实体,电影和流派,但不是电影巨人。我在电影实体中收集了一些流派,反之亦然。问题是EF执行查询时,填充所有集合。 EF填充电影中的流派集合,并在流派中填充电影集合。所以一个电影有风格的集合,具有电影的集合与movies.So我送了很多的实体时,我只wnat更新之一。 –