2013-08-23 56 views
2

我有以下實體:實體框架代碼優先樹模型

public class Module 
{ 
    public Module() 
    { 
     SubModules = new List<Module>(); 
    } 

    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Action { get; set; } 
    public string Controller { get; set; } 
    public string Icon { get; set; } 

    public List<Module> SubModules { get; set; } 
} 

,當通過代碼首先初始化生成以下表模式:

CREATE TABLE [dbo].[Modules](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Title] [nvarchar](max) NULL, 
    [Action] [nvarchar](max) NULL, 
    [Controller] [nvarchar](max) NULL, 
    [Icon] [nvarchar](max) NULL, 
    [Module_Id] [int] NULL, 
CONSTRAINT [PK_dbo.Modules] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) 
) 

GO 
ALTER TABLE [dbo].[Modules] WITH CHECK ADD CONSTRAINT [FK_dbo.Modules_dbo.Modules_Module_Id] FOREIGN KEY([Module_Id]) 
REFERENCES [dbo].[Modules] ([Id]) 
GO 
ALTER TABLE [dbo].[Modules] CHECK CONSTRAINT [FK_dbo.Modules_dbo.Modules_Module_Id] 
GO 

的問題是,當我填寫此包含父模塊(Module_Id爲null)和兩個子模塊(父模塊的Module_Id)並查詢DBContext的模塊集合,我得到父模塊正確收集子模塊的集合,但是我也得到了返回的子模塊通過他們自己。

所以模塊集合中的DbContext看起來有點像這樣:

ParentModule 
---Child Module 
---Child Module 
Child Module 
Child Module 

我需要的是爲這兩個子模塊不要在自己的權利被返回模塊,但只是作爲的孩子父母。

希望我已經解釋過了。

回答

5

我會爲您的Module類添加一個ParentModuleId屬性(int?)。

public class Module 
{ 
    public Module() 
    { 
     SubModules = new List<Module>(); 
    } 

    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Action { get; set; } 
    public string Controller { get; set; } 
    public string Icon { get; set; } 

    public int? ParentModuleId { get; set; } 

    [ForeignKey("ParentModuleId")] 
    public virtual ICollection<Module> SubModules { get; set; } 
} 

通知我如何還增加了一個ForeignKey屬性的子模塊列表,以確保新ParentModuleId屬性用作外鍵列。

這樣你可以手動檢查父模塊的存在。

然後,您可以得到「根模塊」是這樣的:

var rootModules = context.Modules.Where(x => x.ParentModuleId == null); 

如果你需要很多,你也可以創建一個擴展方法:

public IQueryable<Module> WithoutParent(this IQueryable<Module> modules) 
{ 
    return modules.Where(x => x.ParentModuleId == null); 
} 

var rootModules = context.Modules.WithoutParent(); 
2

無法添加發表評論,但克里斯托弗·克拉斯忘記使

public List<Module> SubModules { get; set; } 

虛擬爲:

public virtual List<Module> SubModules { get; set; } 

否則當EntityFramework從數據庫加載Children時,無法爲您預先填充List。所以正確的代碼是:

public class Module 
{ 
    public Module() 
    { 
     SubModules = new List<Module>(); 
    } 

    // Other properties 

    public int? ParentModuleId { get; set; } 

    [ForeignKey("ParentModuleId")] 
    public virtual List<Module> SubModules { get; set; } 
}