实体框架:按多对多排序

时间:2012-06-05 09:36:47

标签: c# sql winforms entity-framework

我有两个具有多对多关系的实体,我正在寻找一种方法来对表中的结果进行排序。
换句话说,当我从table1获取一行并且从table2获取所有相应的记录时,我希望能够为table2存储特定于table1中该行的存储排序顺序。

我的第一个想法是在表中添加一个表示关系的排序列,但据我所知,无法访问关系中的新列。

有人对如何做到这一点有任何建议吗?

4 个答案:

答案 0 :(得分:2)

正如Ladislav Mrnka所述,如果将新列添加到联结表中,将会有一个“中间”的新实体,这将使导航变得更加困难。

如果你想避免这种情况,但仍然可以像往常一样进行导航,你可以保留联结表并添加一个新表,就像结点一样,添加了订单列。当您需要订单信息时,您只需加入此表即可获取并使用它。

这个新表当然需要一些维护。即您可以在级联上为联结+订单创建删除到联结表。并使用触发器(ooops,这不好!)为每个新创建的关系创建一个默认顺序的新行。因此,在业务逻辑中处理此问题会更加明智。

我知道这太棘手了,但没有神奇的解决方案......只需选择对你来说更舒服的东西。

答案 1 :(得分:1)

您可以将新列添加到联结表,但该表将成为新实体,因此您的模型现在将由三个实体组成,其中两个一对多关系而不是两个实体和单个多对多关系

答案 2 :(得分:1)

由于您需要按table1行而不是全局排序table2结果,因此您有三个非优雅的解决方案:

  • Ladislav建议的方法(看起来很糟糕) - 添加订单栏,添加桥梁实体

  • JotaBe建议的方法(看起来很糟糕) - 添加一个额外的表并维护

  • 如果使用上下文仅用于阅读(无需更改关系),并且您不介意在每次更新后手动更改EDMX ,然后你可以破解emdx并将关系表的SSDL定义更改为SQL查询,例如

<EntitySet Name="AS_TO_BS" EntityType="BlaBla.Store.AS_TO_BS">
    <DefiningQuery>
        SELECT ID1, ID2 ORDER BY ORDERVALUE
        FROM AS_TO_BS
    </DefiningQuery>
</EntitySet>

<EntitySet Name="AS_TO_BS" EntityType="BlaBla.Store.AS_TO_BS"> <DefiningQuery> SELECT ID1, ID2 ORDER BY ORDERVALUE FROM AS_TO_BS </DefiningQuery> </EntitySet>

而不是:

<EntitySet Name="AS_TO_BS" EntityType="BlaBla.Store.AS_TO_BS"
    store:Type="Tables" Schema="MY_SCHEMA" />

看看你是否可以放宽你的要求,如果没有,那就选择三种解决方案中的一种。

编辑:

另一个想法:

  • 使用视图复制关系表,然后将关系映射到视图(作为只读),将映射实体映射到表(可写)。

答案 3 :(得分:0)

谢谢大家对我的问题的好答案。我现在对不同解决方案的利弊更有信心。

我最终做的是这样的:事实证明,只是在关系表中添加一个排序列不会影响模型,从DB更新仍然有效,并且表仍然被映射为多个 - 很多关系。然后我创建了一个存储过程,它从关系表和另一个存储过程中获取sort列,以更新指定记录的排序索引。