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

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

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

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

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

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

【问题讨论】:

    标签: c# entity-framework many-to-many self-reference


    【解决方案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);
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      相关资源
      最近更新 更多