关于许多对象包括许多对象

时间:2013-06-18 17:18:49

标签: c# entity-framework-4 sqlite

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

当我搜索一些电影时,我也得到了相关的实体,所以在急切加载时我会填充我的实体电影的集合类型。是我想要的。

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

因此,如果在我的第一次搜索中我获得了很多电影,当我想要更新一部电影时,我发送了许多我不需要播种的实体,因此网络中有很多流量。 / p>

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

我使用的是SQLite和EF 4.4;我试图找到mergeOption来禁用对类型的跟踪,但我找不到它。

感谢。

1 个答案:

答案 0 :(得分:1)

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

两个实体之间的一对多关系只需要每个实体的表(简单的外键关系)。所以,如果你的类型表只是一个给定电影的类型列表,它将是一对多的(电影作为父母,作为孩子的类型);那会有用。

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

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