多对多(自相关)特定订单实体框架
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);
【讨论】:
以上是关于多对多(自相关)特定订单实体框架的主要内容,如果未能解决你的问题,请参考以下文章