Сопоставление отношений с конкретными таблицами

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

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

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

Когда код сначала сопоставил его с двумя таблицами:

  1. Узлы
  2. УзлыУзлы

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

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

  1. Узлы
  2. Фромс
  3. Тос

И два отношения Один ко многим между узлами и отправителями, а также узлами и получателями.

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

БОЛЬШЕ ОПИСАНИЯ

Опишу подробнее, существующую проблему:

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

Структура сущности сопоставила класс конвейера (узла) с ДВУМЯ таблицами, как показано ниже:

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

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

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

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

Например:

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

person Vahid Hassani    schedule 05.02.2012    source источник


Ответы (1)


В таком случае ваши отношения не могут быть связаны с классом 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 не может таким образом сопоставлять несколько таблиц с одним и тем же объектом, и это также не имеет никакого смысла, поскольку в некоторых случаях один узел может быть from, а в других — to.

Редактировать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"));                    
}
person Ladislav Mrnka    schedule 05.02.2012
comment
Спасибо, ладислав, но мне не нужны ICollection‹From› и ICollection‹To› в экземплярах Node. Мне нужна коллекция узлов, когда я использую свойства Froms и Tos экземпляра Node. - person Vahid Hassani; 05.02.2012
comment
В таком случае у вас будет всего две таблицы, как сейчас. - person Ladislav Mrnka; 05.02.2012
comment
Уважаемый Ладислав, я более подробно описал проблему, пожалуйста, взгляните на более подробное описание. - person Vahid Hassani; 06.02.2012