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; }
}

其中,当通过 Code First 初始化时,会生成下表 Schema:

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 中的 Modules 集合看起来有点像这样:

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

我需要的是让这两个子模块本身不作为模块返回,而仅作为父模块的子模块返回。

希望我已经解释清楚了。

4

2 回答 2

5

我会int?在您的 Module 类中添加一个 ParentModuleId 属性 ( )。

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; }
}

请注意,我还向ForeignKeySubModules 列表添加了一个属性,以确保将新的 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();
于 2013-08-23T08:54:59.327 回答
2

无法添加评论,但 Kristof Claes 忘记了

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

虚拟如:

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

否则,EntityFramework 在从数据库加载子项时无法为您预填充列表。所以正确的代码是:

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; }
}
于 2014-01-19T10:52:29.870 回答