2014-11-04 63 views
1

我是新來實體框架並試圖將以下模型存儲到數據庫。我看過this教程。我想先使用代碼將以下模型存儲到數據庫,但我無法獲得它存儲此遞歸結構。它只存儲初始根節點。如何用實體框架5.0存儲遞歸模型

我的模型看起來是這樣的:

public abstract class Node : INode 
{ 
    public int NodeId { get; set; } 

    public Node() 
    { 
     Nodes = new List<INode>(); 
    } 

    public INode ParentNode { get; set; } 

    public List<INode> Nodes { get; private set; } 

    public string Name { get; set; } 
} 

和派生亞型:

public class Module : Node, IModule 
{ 
} 

public class Location: Node, ILocation 
{ 
} 

的接口是這些:

public interface INode 
{ 
    INode ParentNode { get; set; } 

    List<INode> Nodes { get; } 

    string Name { get; set; } 
} 

public interface IModule : INode 
{ 
} 

public interface ILocation : INode 
{ 
} 

這是我的DbContext:

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

然後,我創建一個父模塊節點的模型,其中包含兩個位置節點。如果我嘗試用此代碼存儲它

using (var db = new SqlEntityContext()) 
{ 
    db.SqlSystemNodes.Add(Root as SqlSystemNode); 
    db.SaveChanges(); 
} 

只有根節點被存儲到數據庫。我試圖給每個亞型自己的鑰匙,但沒有成功。我怎麼能夠將這個模型存儲到數據庫,有什麼想法?它甚至有可能嗎?

+1

您是否嘗試過將所有子節點過多的情況下?看起來您沒有爲您的Node Parent添加外鍵,這使EF很難識別您想要的結果映射。檢查您創建的模式,如果它以您想要的方式創建。 – UrbanEsc 2014-11-04 15:22:28

回答

0

您是否在您的數據庫上下文初始化程序中定義了父子關係?

您初始化應該有東西要給這樣的:

modelBuilder.Entity<Node>() 
    .HasMany(o => o.Nodes) 
    .WithOptional() // or .WithRequired() 
    .Map(m => m.MapKey("ParentNodeId")); 
+0

我會的,但我找不到方法來訪問初始化程序 – coder0815 2014-11-04 15:50:48

+0

找到它了,我會在我回來工作時明天嘗試它 – coder0815 2014-11-04 15:58:56

+0

正如@UrbanEsc所說,可能您沒有創建外鍵。但是你可以在流利的API中定義它。請記住重新創建數據庫或創建適當的遷移,但重新創建數據庫會簡單得多:) – rraszewski 2014-11-05 06:20:00