来自多个不同表的EF多对多关系

时间:2016-06-24 17:22:24

标签: c# asp.net asp.net-mvc entity-framework

我们说我有4个表:tbl_dogstbl_catstbl_birdstbl_fish,每个表都有自己的_Id列,当然..我想创建在任何这些表之间具有多对多关系的能力。在我的脑海中,我想象了一个tbl_relationships表,其中包含两列animal1_idanimal2_id,我可以将条目设为cat_12 | dog_3bird_1 | dog_9,{{1这是一个2部分问题:

  • 1)首先使用EF代码可以吗?意思是我和#34;关系中的两个列"表实际上可以从多个不同的表中提取?如果是这样,我将如何在EF类中定义它?
  • 2)如果不是fish_8 | cat_4animal1_id作为列,我想要animal2_idparent_animal,以便当我去看{{1}时1}},我可以将child_animal作为fish的所有child_animal记录以及具有该fish的所有parent_animal记录拉出来一个parent_animal

非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

任何关系数据库都无法实现。实体框架不是重点。必须对特定表进行外键。周期。

在Python框架中,Django通过其通用内容类型来处理你正在寻找的东西,但它更像是一个黑客而不是任何东西。对于每个通用相关项,设置两列:一列用于对象的类型,另一列用于对象的id。没有外键,因为在这种情况下,外键是不可能的。

在框架代码中,为了实现相关对象,他们然后使用对象id向正确的表(基于对象类型)发出查询。但是,这在Python中比更简单,因为Python是鸭子类型。

如果你有充分的动力,你可以在C#技术上达到同样的目的,但这将是一个完全手动的努力。实体框架在这里没有任何帮助。你还需要使用反射来最终实现正确的类型,反射既是后期的痛苦又是非常低效的(慢)。

也就是说,由于这里的特定场景涉及所有特定类型的事物,动物,你可以通过继承来实现你正在寻找的东西。换句话说,您可以创建Animal实体,然后让DogCatBirdFish等继承自{{1} }}。然后,您可以创建Animal的外键并与其中任何一个进行交互。但是,您只能以Animal s与它们进行互动,而不是像Animal那样具体。{/ p>

答案 1 :(得分:0)

如果您需要一个只有两列的矩阵表,并且您需要将每种动物类型放在自己的表中,那么Chris Pratt的答案就是简洁。

如果你可以使用两列以上但是被迫坚持使用单独的动物表,我会尝试在矩阵表中为每个动物表创建一个列,并将此矩阵表变成一个巨大的多列圆形怪物。

如果您在矩阵表中限制为两列,但可以根据您要查找的父/子组合来定位矩阵表,那么我将设置十二个矩阵表,并将它们中的每一个用于其中一个每对动物表可能的动物组合。如果动物表的数量实际上要大得多,显然你会遇到问题。

如果动物表本身都具有相同的列(类型/内容/要求),则可能存在解决方法。您可以将所有动物放在一个表格中,其中的标识符表示它是什么类型的动物。这通常是附加到动物类型查找表的外键。然后你可以把你的矩阵表作为父列和子列,因为它们只与一个其他表有明确的关系('mass animal'表;父和子都会指向它的PK)。

前一段的更优雅可能的解决方法(我还没有机会使用它,所以我对它的实现非常朦胧,对于陷阱而言)是Inheritance。继承允许您组合几个表,这些表保存几乎相同(在字段和数据类型方面)的数据集合,并且能够通过鉴别器区分这些集合。这样,根据前一段,你可以有一个带有一个鉴别器的Animals表,它指示每一行是什么(cat,dog等),以及一个矩阵表,其中父和子指向的ID是动物表。由于矩阵表中的每一列都与唯一表(而不是多个表)有关联,因此可以很好地解决这个问题。