首页 文章

实体框架:按多对多排序

提问于
浏览
1

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

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

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

4 回答

  • 2

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

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

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

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

  • 1

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

  • 1

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

    • Ladislav建议的方法(看起来很糟糕) - 添加订单栏, add bridge entity .

    • JotaBe提出的方法(看起来很糟糕) - add an additional table and maintain both .

    • 如果使用上下文 only for reading (无需更改关系)并且您不介意来自DB的 changing the EDMX manually after every update ,那么您可以破解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" store:Type="Tables" Schema="MY_SCHEMA" />`

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

    编辑:

    另一个想法:

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

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

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

相关问题