2012-03-11 85 views
1

我想使用EF Code First將圖形存入數據庫here使用EF Code First存儲圖形

我定義的屬性與相鄰節點的集合:

public class Node { 
    public int NodeId { get; set; } 
    public string NodeName { get; set; } 
    public ICollection<Node> Nodes { get; set; } 
} 

但EF生成這個模型只有一個表:

dbo.Nodes 
    NodeId (PK, int, not null) 
    NodeName (nvarchar(max), null) 
    Node_NodeId (FK, int, null) 

如何強制EF產生許多一對多的關係?

是否有任何其他方法可以將圖存儲在數據庫中?

回答

2

您的班級模型表示Node有一個節點集合,可以完全適應生成的表格。如果你想要多對多的話,你必須告訴EF你的計劃。

一兩件事你可以做的就是讓家長和孩子集合:

public class Node 
{ 
    public int Id { get; set; } 
    public string NodeName { get; set; } 
    public ICollection<Node> ParentNodes { get; set; } 
    public ICollection<Node> ChildNodes { get; set; } 
} 

EF將創建一個連接表如下:

[dbo].[NodeNodes] 
    [Node_Id] [int] NOT NULL, 
    [Node_Id1] [int] NOT NULL 

如果你願意,你可以列更有意義的名稱此操作:

class NodeContext : DbContext 
{ 
    public DbSet<Node> Nodes { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<Node>() 
      .HasMany(n => n.ParentNodes) 
      .WithMany(n => n.ChildNodes) 
      .Map(c => c.MapLeftKey("ChildNodeId") 
       .MapRightKey("ParentNodeId")); 
    } 
} 

試試這個:

var root = new Node { NodeName = "Root" }; 
root.ParentNodes = new List<Node> { new Node { NodeName = "Par1" }, new Node { NodeName = "Par2" } }; 
root.ChildNodes = new List<Node> { new Node { NodeName = "Ch1" }, new Node { NodeName = "Ch2" } }; 
con.Nodes.Add(root); 
con.SaveChanges(); 

(其中conNodeContext實例)並查看您是否喜歡結果。