2012-03-11 3 views
1

Я пытаюсь сохранить график в базе данных, как описано here с EF Code First.Хранение графа с кодом EF Сначала

я определил свойство с коллекцией соседних узлов:

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(); 

(Где con - пример NodeContext) и посмотреть, хотите ли вы результат.

Смежные вопросы