在代码第一实体框架4.3中将自联接映射到集合

Omr*_*itt 4 c# entity-framework entity-framework-4.3

我有一个POCO类映射到这样定义的自连接表:

CREATE TABLE [dbo].[GalleryCategories](
    [CategoryID] [int] IDENTITY(0,1) NOT NULL PRIMARY KEY CLUSTERED,
    [Name] [nvarchar](256) NOT NULL,
    [ParentID] [int] NULL REFERENCES [dbo].[GalleryCategories] ([CategoryID]) ON DELETE NO ACTION ON UPDATE NO ACTION, 
)
Run Code Online (Sandbox Code Playgroud)

我知道有一种方法可以使用模型构建器来定义关系,以引用来自子项的父项...(例如,像这样)

但我试图绘制的课程看起来像这样......

public class GalleryCategory
{
    [Key]
    public int CategoryID { get; set; }
    public string Name { get; set; }
    public int? ParentID { get; set; }
    public List<Category> Subcategories { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,我正在尝试使用所有子项填充子类别 - 即遍历层次结构,而不是层次结构.

有没有办法用EF做到这一点?这必须是一个常见问题解答,但谷歌搜索一小时后我找不到它:-)

Mar*_*eta 10

这应该是您班级中的列表子类别吗?如果是这样,并且它是一个自引用表,您可以像这样创建数据注释的映射:

 public class GalleryCategory
    {
        [Key]
        public int CategoryID { get; set; }
        public string Name { get; set; }
        public int? ParentID { get; set; }
        [ForeignKey("ParentID")]
        public virtual List<GalleryCategory> Subcategories { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

或者像这样流利:

 public class Model : DbContext
    {
        public DbSet<GalleryCategory> Categories { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<GalleryCategory>()
               .HasMany(x => x.Subcategories)
                .WithOptional()
                .HasForeignKey(g => g.ParentID);
        }
    }
Run Code Online (Sandbox Code Playgroud)