多对多(自相关)特定订单实体框架

Posted

技术标签:

【中文标题】多对多(自相关)特定订单实体框架【英文标题】:Many to Many (self related) specific order entity framework 【发布时间】:2012-01-18 00:44:17 【问题描述】:

您好,我显然正在尝试做不可能的事情。

我需要一个与自身具有多对多关系的自引用表,该表首先在 c# 实体框架 (4.2) 数据库中具有特定顺序。

把它想象成朋友有朋友,他们在其中建立友谊 > 最好的朋友到最坏的朋友。

在不使用“FriendToFriend”关系实体的情况下,有没有办法做到这一点?我希望能够使用 Friend.Friends (删除订单列会创建它),但我会有一个基于他们的friendshipOrder 的默认订单。我的工作看起来像是扩展生成的类以按顺序为 Friends 提供一个新属性。

还有其他人有更好的想法吗?

【问题讨论】:

【参考方案1】:

实体框架不支持有序集合。这是 EF 显示其不成熟的许多情况之一。

如果 nHibernate 是一个可行的选项,请尝试它。它supports ordered collections。

使用 EF,您必须使用额外的列映射中间表,并根据您的逻辑手动调整排序。

【讨论】:

感谢您的回复。我基本上必须按照我在问题中描述的方式解决它。我希望更多的人会回答,但看起来没有答案,除了大量修改 SSDL 之外,我几天都不想费力。【参考方案2】:

我知道我迟到了,但是在将其设计为数据模型时,我更愿意添加一个关系表,并且该关系表应该有一个定义顺序的属性(例如,最坏的朋友是 0 , 最好是 100)。

然后,在 EF 中,如果我要检索的列表应该是该顺序,我将按该属性显式排序。

这意味着无论您使用何种方法来查询数据,都可以始终如一地使用这种关系。因此,如果您使用的是 EF,则可以使用它(虽然,是的,它不如 Friend.Friends 方便,但代码的意图会更清晰 - Friend.FriendRelationships.Select(p => p. Friend).OrderBy(p => p.OrderValue)),如果你使用的是直接 SQL,那么你也可以使用它。

如果我在代码中遇到 Friend.Friends,我不知道会对其应用什么排序。

如果你必须拥有它,你总是可以将它添加为非数据库属性 -

public class Friend

  public virtual List<FriendRelationship> UnorderedFriendList  get; set; 

  [NotMapped]
  public IEnumerable<Friend> Friends
  
    get
    
       return UnorderedFriendList.Select(p => p.Friend).OrderByDescending(p => p.OrderValue);
    
  

【讨论】:

以上是关于多对多(自相关)特定订单实体框架的主要内容,如果未能解决你的问题,请参考以下文章

实体框架自引用分层多对多

多对多关系 JPA 与实体

多对多和自我参考表!获取用户拥有的所有角色。实体框架

实体框架:多对多插入重复

删除多对多实体框架

删除多对多实体框架