我有两个具有多对多关系的实体,我正在寻找一种方法来对表中的结果进行排序。
换句话说,当我从table1获取一行并且从table2获取所有相应的记录时,我希望能够为table2存储特定于table1中该行的存储排序顺序。
我的第一个想法是在表中添加一个表示关系的排序列,但据我所知,无法访问关系中的新列。
有人对如何做到这一点有任何建议吗?
答案 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列,以更新指定记录的排序索引。