Сопоставить отношения с конкретными таблицами - PullRequest
1 голос
/ 05 февраля 2012

У меня есть класс, как показано ниже:

    public class Node
    {
         public int NodeID { get; set; }

         public virtual ICollection<Node> Froms { get; set; }
         public virtual ICollection<Node> Tos { get; set; }
    }

Когда Code First отобразил его в 2 таблицы:

  1. 1007 * Вершина *
  2. NodesNodes

И два От одного ко многим Отношения между ними,

Теперь вопрос в том, как я могу сделать ef, чтобы сделать 3 таблицы, как показано ниже:

  1. 1019 * Вершина *
  2. Froms
  3. Tos

И два От одного ко многим Отношения между узлами и Froms плюс узлы и Tos

Я разместил два изображения в своем сообщении asp.net, которые могут помочь asp.net сообщение

ПОДРОБНОЕ ОПИСАНИЕ

Позвольте мне подробнее описать существующую проблему:

Я моделирую трубопроводную систему, которая имеет структуру, подобную узлу, который я уже упоминал. Трубопровод может начинаться со многих других конвейеров и может заканчиваться многими другими конвейерами, например: трубопровод № 1 начинается с номера 2,3,4 и заканчивается номерами 5 и 6.

Каркас сущности отобразил класс конвейера (Node) на две таблицы, как показано ниже:

  Nodes
=========
   ID
---------
   1
   2
   3
   4
   5
   6
         NodeNodes  
============================
Node_NodeID     Node_NodeID1
----------------------------
   1                    2
   1                    3
   1                    4
   5                    1
   6                    1

Отлично! EF очень умно помещает начало и конец в одну таблицу, но в чем главная проблема?!

Когда пользователь определяет начало и конец конвейера номер 1, если он посмотрит на 2,3 и 4, то увидит, что они заканчиваются на 1, а если он пойдет на 5 и 6, он увидит, что они начинаются с 1. Эта дополнительная информация ( конечно они верны) не желательно.

Я думаю о решении и придумываю идею: если у меня есть две таблицы для ОТ и ТО, я не объясню проблему.

Например:

         Froms  
============================
Node_NodeID     From_NodeID1
----------------------------
   1                    2
   1                    3
   1                    4
         Tos    
============================
Node_NodeID     To_NodeID1
----------------------------
   1                    5
   1                    6

1 Ответ

2 голосов
/ 05 февраля 2012

В этом случае ваши отношения не могут быть в классе Node, но вы должны создать новый класс From и To.

public class To { ... }
public class From { ... }

public class Node
{
     public int NodeID { get; set; }

     public virtual ICollection<From> Froms { get; set; }
     public virtual ICollection<To> Tos { get; set; }
}

Редактировать:

EF не в состоянииотображать несколько таблиц в одну и ту же сущность таким образом, и это также не имеет никакого смысла, поскольку в некоторых случаях может быть один узел, а в других - нет.

Редактировать2:

ОК.Это должно быть возможно, но вы должны будете поддерживать каждое отношение отдельно.Вы должны использовать свободный API, чтобы отобразить это.В вашем контексте переопределите OnModelCreating метод:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{
    modelBuilder.Entity<Node>()
                .HasMany(n => n.Froms)
                .WithMany()
                .Map(m => m.ToTable("Froms"));

    modelBuilder.Entity<Node>()
                .HasMany(n => n.Tos)
                .WithMany()
                .Map(m => m.ToTable("Tos"));                    
}
...