2015-10-06 178 views
0

我試圖找出如何映射以下關係:EF映射一對多

  • 的「關係」實體需要一個「節點」和「RelatedNode」。

  • Node實體具有「關係」(HasMany)的集合,其中節點被要求是Relation.Node或Relation.RelatedNode。

當前映射導致看起來像這樣的表:

[Id],[NodeId],[RelatedNodeId],[RelationType],[Node_Id] 

[NODE_ID]是越來越自動創建,而這也正是我想避免的。

關聯實體:

public class Relation 
{ 
    private Relation() 
    { 

    } 

    public Relation(int nodeId, int relatedNodeId) 
    { 
     NodeId = nodeId; 
     RelatedNodeId = relatedNodeId; 
    } 

    public Relation(Node node, Node relatedNode) 
    { 
     Node = node; 
     RelatedNode = relatedNode; 
    } 

    public int Id { get; set; } 

    public int NodeId { get; set; } 

    public Node Node { get; set; } 

    public int RelatedNodeId { get; set; } 

    public Node RelatedNode { get; set; } 

    public RelationType RelationType { get; set; } 
} 

流利的API:

// Relation 
modelBuilder.Entity<Relation>().Map(m => 
{ 
    m.ToTable("Relations"); 
}); 
modelBuilder.Entity<Relation>() 
    .HasKey(t => t.Id) 
    .Property(t => t.Id) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
modelBuilder.Entity<Relation>().HasRequired(t => t.Node). 
    WithMany().HasForeignKey(t => t.NodeId).WillCascadeOnDelete(false); 
modelBuilder.Entity<Relation>().HasRequired(t => t.RelatedNode). 
    WithMany().HasForeignKey(t => t.RelatedNodeId).WillCascadeOnDelete(false); 


// Node 
modelBuilder.Entity<Node>().Map(m => 
{ 
    m.MapInheritedProperties(); 
    m.ToTable("Nodes"); 
}); 
modelBuilder.Entity<Node>().HasMany(t => t.Relations); 

回答

0

刪除此行

modelBuilder.Entity<Node>().HasMany(t => t.Relations); 

您已指定上述這種關係。


實體框架添加該列以表示從關係到節點的關係。由於您爲「節點」和「相關節點」指定了HasForeignKey,因此會創建「NodeId」和「RelatedNodeId」列(如您所期望的那樣)。

「Node_Id」列是當EF需要未指定的FK時所生成的列。因此,在某處,EF被告知從節點到關係存在關係,並且未指定FK(刪除該行)

+0

我已將其刪除。創建的數據庫模式仍然具有[Node_Id](不需要),以及所需的[NodeId]和[RelatedNodeId])。 – blgrnboy

+0

嗯,應該是原因。你如何生成模式?當我使用CodeFirst遷移時,我總是忘記使用-force,有時我的更改沒有反映出來。 – Vlad274

+0

我剛剛刪除了整個數據庫,然後運行它。我禁用了代碼優先的遷移。 – blgrnboy