gpt4 book ai didi

ef-code-first - Entity Framework 代码优先树模型

转载 作者:行者123 更新时间:2023-12-03 17:33:53 26 4
gpt4 key购买 nike

我有以下实体:

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 初始化时生成下表架构:

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

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

希望我已经解释清楚了。

最佳答案

我会向您的模块类添加一个 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 属性添加到 SubModules 列表以确保将新的 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();

关于ef-code-first - Entity Framework 代码优先树模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18398417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com