我有以下实体:
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
我需要的是这两个子模块本身不能作为模块返回,而只能作为父级的子项返回。
希望我已经解释过这个。
答案 0 :(得分: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; }
}
请注意我如何在SubModules列表中添加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();
答案 1 :(得分:2)
无法添加评论,但Kristof Claes忘记了
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; }
}