1

I have two entities with a many-to-many relationship and I'm looking for a way to be able to sort the result from the tables.
In other words, when I get a row from table1 and all the corresponding records from table2 I want to be able to have a stored sort order for table2 that's specific for that row in table1.

My first thought was to add a sort column to the table that represents the relation, but to my knowledge there is no way of accessing the new column in the relation.

Does anybody have any suggestions on how to accomplish this?

4

4 回答 4

2

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

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

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

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

于 2012-06-05T10:09:41.967 回答
1

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

  • Ladislav 建议的方法(使用看起来很糟糕的模型) - 添加 order 列,添加 bridge entity

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

看看您是否可以放宽您的要求,如果不能,请选择三种解决方案之一。

编辑:

另一个想法:

  • 使用视图复制关系表,然后将关系映射到视图(只读)和订单实体映射到表(可写)。
于 2012-06-05T16:15:01.890 回答
1

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

于 2012-06-05T09:52:16.120 回答
0

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

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

于 2012-06-07T10:55:49.023 回答