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>`
4 回答
正如Ladislav Mrnka所述,如果将新列添加到联结表中,将会有一个“中间”的新实体,这将使导航更加困难 .
如果你想避免这种情况,但仍然可以像往常一样进行导航,你可以保留联结表并添加一个新表,就像结点一样,添加了订单列 . 当您需要订单信息时,您可以加入此表来获取并使用它 .
当然,这个新表需要一些维护 . 即您可以在级联上为联结表的联结订单创建删除 . 并使用触发器(ooops,这不好!)为每个新创建的关系创建一个默认顺序的新行 . 因此,在业务逻辑中处理此问题会更为可取 .
我知道它太棘手了,但没有神奇的解决方案......只需选择对你来说更舒服的东西 .
您可以将新列添加到联结表,但该表将成为新实体,因此您的模型现在将包含三个实体,其中包含两个一对多关系,而不是两个实体和单个多对多关系 .
由于您需要按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" />`
看看你是否可以放宽你的要求,如果没有,那就选择三种解决方案中的一种 .
编辑:
另一个想法:
谢谢大家对我的问题的好答案 . 我现在对不同解决方案的利弊更有信心 .
我最终做的是这样的:事实证明,只是在关系表中添加一个排序列不会影响模型,从DB更新仍然有效,表仍然被映射为多对多关系 . 然后我创建了一个存储过程,它从关系表和另一个存储过程中获取sort列,以更新指定记录的排序索引 .