2017-07-05 13 views
0

enter image description hereEFコードここではまず、複数の関係を持つエンティティ

。私はGraphElementsのセットを保持しているGraphを持っています。私のGraphは、Edges,NodesおよびLoadsで構成され、すべて異なる要素です。

例えば、各ノードは、その近隣ノードを知る必要があります。したがって、NeigborNodes -Listが必要です。他の機能については、 -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... 
    } 
} 

私の質問:

私はNeighborNodesを保存するために、私のモデル構成や私のエンティティを変更することができますどのように(A)私のデータベースに?

(B)ConnectedElementsをデータベースに保存するには、モデル構成やエンティティを変更するにはどうすればよいですか?

ありがとうございました!

答えて

0

私は簡単に説明したいと思いソリューション自分自身を見つけることができる:

それは私がいつもそれを見たので、私は最初の場所で実現することができませんでしたどのような関係「多対多」の問題です「1対多」関係の問題として。しかし、このように見ると、それを解決するのはかなり簡単です。現在のケースでは、次のようにモデルを拡張する必要があります。 2つのマッピングテーブルを作成するようにEFに指示する必要があります。この方法で、ノードとGridElements/NeighborNodes間の関係をNodeGridElementそれぞれNodeNeighborNodeと呼ばれる個別のDBマッピングテーブルに格納することができます。

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"); 
      }); 
    } 
} 
関連する問題