繁体   English   中英

实体框架:按多对多排序

[英]Entity-Framework: Sort on Many-to-Many

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

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

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

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

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

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

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

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

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

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

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

  • 如果上下文仅用于读取 (无需更改关系)并且您不介意在每次从DB 更新后手动更改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" store:Type="Tables" Schema="MY_SCHEMA" /> 

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

编辑:

另一个想法:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM