Структура сущностей определенного порядка «многие ко многим» (самостоятельно связанная) - PullRequest
2 голосов
/ 18 января 2012

Здравствуйте, я пытаюсь сделать невозможное, по-видимому.

Мне нужна таблица с собственной ссылкой, имеющая отношение «многие ко многим», которая также имеет определенный порядок в базе данных c # entity Framework (4.2).

Думайте об этом, как о Друзьях, у которых есть Друзья, в которых они заказывают свою дружбу> Лучший друг для худшего друга.

Есть ли возможность сделать это без использования сущности отношений FriendToFriend? Я хотел бы иметь возможность использовать Friend.Friends (удаление столбца порядка создает его), но у меня будет порядок по умолчанию, основанный на их FriendsOrder. Моя работа выглядит как расширение сгенерированных классов, чтобы иметь новое свойство для друзей в порядке.

У кого-нибудь еще есть идеи получше?

Ответы [ 2 ]

2 голосов
/ 18 января 2012

Entity Framework не поддерживает упорядоченные коллекции.Это одна из многих ситуаций, когда EF показывает свою незрелость.

Попробуйте nHibernate, если это жизнеспособный вариант.Он поддерживает упорядоченные коллекции .

. В EF вам придется сопоставить промежуточную таблицу с дополнительным столбцом и вручную настроить порядок в соответствии с вашей логикой.

1 голос
/ 29 июля 2013

Я знаю, что опоздал к этому, но при проектировании этого как модели данных я бы предпочел добавить таблицу отношений, и эта таблица отношений должна иметь свойство, определяющее порядок (например, худший друг равен 0 лучше всего 100).

Тогда в EF я бы явно упорядочил по этому свойству, если список, который я получаю, должен быть того порядка.

Это означает, что независимо от того, какой метод вы используете для запроса данных, эти отношения можно использовать последовательно. Поэтому, если бы вы использовали EF, вы могли бы использовать его (хотя, да, это не так удобно, как Friend.Friends, но код был бы более понятным относительно его намерения - Friend.FriendRelationships.Select (p => p. Друг) .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);
    }
  }
}
...