将关系映射到特定表

时间:2012-02-05 07:12:39

标签: entity-framework entity-framework-4.1 ef-code-first code-first entity-framework-ctp5

我有一个课程如下:

    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. 节点
  2. NodesNodes
  3. 两个一对多之间的关系,

    现在的问题是如何制作如下3个表格的ef:

    1. 节点
    2. - 甲苯磺酰
    3. 两个一对多节点和Froms以及节点和Tos之间的关系

      我在我的asp.net帖子上放了两张可能有用的图片 asp.net post

        

      更多说明

      让我描述更多,现有的问题:

      我正在建模一个管道系统,其结构类似于我已经提到过的NODE。管道可以从许多其他管道开始,并且可以结束到许多其他管道,例如:1号管道从编号2,3,4开始并且结束到编号5和6。

      实体框架将管道(Node)类映射到TWO表,如下所示:

        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开始。这附加信息(当然他们是真的)是不可取的。

      我考虑解决方案并提出一个想法,如果我有两个FROMs和TOs表,我将不会解释问题。

      例如:

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

1 个答案:

答案 0 :(得分:2)

在这种情况下,您的关系不能是Node课程,但您必须开设新的FromTo课程。

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无法以这种方式将多个表映射到同一个实体,它也没有任何意义,因为在某些情况下单个节点可以来自其他情况。

EDIT2:

确定。这应该是可能的,但您必须分别维护每个关系。您必须使用流畅的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"));                    
}