2017-07-05 31 views
0

enter image description hereEF代碼首先,與多個關係

實體在這裏你可以看到我的,我想在我的SQLite數據庫來存儲減少實體結構。我有一個Graph,其中包含一組GraphElements。我GraphEdgesNodesLoads這是所有不同的元素。

對於深優先搜索,例如每個節點需要知道它的鄰居節點。因此我需要NeigborNodes -List。對於其他功能,我還需要了解ConnectedElements -List。

class Graph 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual List<GraphElement> GraphElements { get; set; } 
} 

[Table("GraphElements")] 
abstract class GraphElement 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual Graph Graph { get; set; } 
} 

[Table("Nodes")] 
class Node : GraphElement 
{ 
    public virtual List<Node> NeighborNodes { get; set; } 
    public virtual List<GraphElement> ConnectedElements { get; set; } 
} 

[Table("Edges")] 
class Edge : GraphElement 
{ 
    public virtual Node From { get; set; } 
    public virtual Node To { get; set; } 
} 

[Table("Loads")] 
class Load : GraphElement 
{ 
    public virtual Node From { get; set; } 
} 

我的模型配置看起來像這樣的時刻,當然不工作。 (我每類型(TPT)的方式表的工作。)

public class ModelConfiguration 
{ 
    private static void ConfigureGridDataCollectionEntity(DbModelBuilder modelBuilder) 
    { 
     // Graph 
     modelBuilder.Entity<Graph>().ToTable("Base.GraphTable") 
      .HasRequired(p => p.GraphElements) 
      .WithMany() 
      .WillCascadeOnDelete(true); 

     // GraphElement 
     modelBuilder.Entity<GraphElement>() 
      .HasRequired(p => p.Graph) 
      .WithMany(graph => graph.GraphElements) 
      .WillCascadeOnDelete(false); 

     // Edge 
     modelBuilder.Entity<Edge>() 
      .HasOptional(p => p.From) 
      .WithMany(node => node.ConnectedElements) // Convertion error 
      .WillCascadeOnDelete(false); 

     modelBuilder.Entity<Edge>() 
      .HasOptional(p => p.To) 
      .WithMany(node => node.ConnectedElements) // Convertion error 
      .WillCascadeOnDelete(flase); 

     // Load 
     modelBuilder.Entity<Load>() 
      .HasOptional(p => p.From) 
      .WithMany(node => node.ConnectedElements) // Convertion error 
      .WillCascadeOnDelete(false); 

     // Node 
     // No idea at all... 
    } 
} 

我的問題:

(A)我怎樣才能改變我的模型配置或我的實體存儲NeighborNodes在我的數據庫?

(B)我怎樣才能改變我的模型配置或我的實體存儲在我的數據庫ConnectedElements

感謝您的幫助!

回答

0

我能找到的,我想解決自己簡單介紹一下:

這是一個物質的「多對多」的關係我沒能在第一時間實現的,因爲我總是看到它作爲「一對多」關係問題。但是當你看到它時,解決它非常簡單。在目前的情況下,您必須按如下方式擴展模型。你必須告訴EF創建兩個映射表。這樣,您就可以存儲節點和GridElements之間的關係/在單獨的數據庫映射,表格NeighborNodes稱爲NodeGridElement各自NodeNeighborNode

public class ModelConfiguration 
{ 
    private static void ConfigureGridDataCollectionEntity(DbModelBuilder modelBuilder) 
    { 
     // Graph 
     modelBuilder.Entity<Graph>().ToTable("Base.GraphTable") 
      .HasRequired(p => p.GraphElements) 
      .WithMany() 
      .WillCascadeOnDelete(true); 

     // GraphElement 
     modelBuilder.Entity<GraphElement>() 
      .HasRequired(p => p.Graph) 
      .WithMany(graph => graph.GraphElements) 
      .WillCascadeOnDelete(false); 

     // Node 
     modelBuilder.Entity<Node>() 
      .HasMany(p => p.ConnectedElements) 
      .WithMany() 
      .Map(cs => 
      { 
       cs.MapLeftKey("NodeId"); 
       cs.MapRightKey("GridElementId"); 
       cs.ToTable("NodeGridElement"); 
      }); 

     modelBuilder.Entity<Node>() 
      .HasMany(p => p.NeighborNodes) 
      .WithMany() 
      .Map(cs => 
      { 
       cs.MapLeftKey("NodeId"); 
       cs.MapRightKey("NeighborNodeId"); 
       cs.ToTable("NodeNeighborNode"); 
      }); 
    } 
}