我有一个课程如下:
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个表时:
两个一对多之间的关系,
现在的问题是如何制作如下3个表格的ef:
两个一对多节点和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
答案 0 :(得分:2)
在这种情况下,您的关系不能是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无法以这种方式将多个表映射到同一个实体,它也没有任何意义,因为在某些情况下单个节点可以来自其他情况。
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"));
}