使用EF Code First存储图形

时间:2012-03-11 09:39:02

标签: entity-framework entity-framework-4

我正在尝试将图表保存到数据库中,如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生成多对多关系?

还有其他方法可以在数据库中存储图形吗?

1 个答案:

答案 0 :(得分: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个实例),看看你是否喜欢这个结果。