2012-06-05 94 views
1

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

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

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

+0

您是否想对table1行或全局排序table2结果? –

+0

@DannyVarod每table1行。 – JonC

回答

0

谢谢大家对我的问题的好的答案。我现在对于不同解决方案的优缺点更加自信。

我最终做的是这样的:事实证明,只是向关系表添加一个排序列不会影响模型,从数据库更新仍然有效,并且该表仍然被映射为多对多多种关系。然后我创建了一个存储过程,从关系表中提取排序列,并创建另一个存储过程来更新指定记录的排序索引。

1

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

2

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

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

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

我知道这太棘手,但没有神奇的解决方案......只是选择什么更舒适。

1

由于您的排序按表1的行表2的结果的要求,而不是全球范围内,你有三个不优雅的解决方案:

  • 的方法拉吉斯拉夫建议(与难看模型) - 添加顺序列, 添加桥梁实体

  • 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" /> 

看看你是否可以放松你的要求,如果没有则在这三个解决方案之一定居。

编辑:

另一个想法:

  • 使用视图复制的关系表,然后映射到视图的关系(如只读)和订单实体表(可写) 。
+0

其他解决方案无意违反,所有3种解决方案都不理想。如果EF支持将关系和实体同时映射到同一个表,最好的解决方案是。 –