2013-08-23 57 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; } 
}