2012-08-15 40 views
1

我必须映射到这样定义自加入表POCO类:映射自加入一个集合中的代码第一个实体框架4.3

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, 
) 

我知道有一种方法来定义的关系使用模型构建器从孩子引用父...(如like this

但我试图映射类看起来像这样...

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

换句话说,我试着去获取所有子项填充的子类 - 即遍历层次结构,而不是层次结构。

有什么办法可以使用EF做到这一点?这肯定是一个常见问题,但我找不到它后Google搜索一小时:-)

回答

9

应该是一个列表你的班级子类别?如果是这样,这是一个自我引用表,您可以创建映射方式数据注释这样可以:

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

或流利这样的:

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); 
     } 
    } 
+0

感谢马克 - 值得注意的是,流利代码性格字符完全是我试过的代码,并且它很好地工作。 我最初尝试[ForeignKey()]属性,但它没有在4.3编译...似乎有一个[Association]属性,我认为我可以用来完成相同的事情,但我无法让它工作。你知道[ForeignKey]被重命名为什么吗? – 2012-08-15 22:52:11

+0

还有一条评论...我可以让linq查询很好地工作 - 例如GalleryCategories.Include(“Subcategories.Activities”)。Include(“Activities”)。其中(c => c.ParentID == null)。但是,当我尝试添加一个具有子类别的新GalleryCategory时,EF引发外键关系异常(基本上,它不会自动修复子类别的ParentID与服务器分配给GalleryCategory的内容)。我是否需要在映射中做一些特殊的事情来使这个场景正常工作,还是仅仅是EF的限制,我不得不“手动”执行递归添加? – 2012-08-15 23:00:36

+0

你可以在新的问题中发布这个细节吗?请务必包括您正在进行的全部通话。 EF应该能够通过简单地添加导航属性来建立连接。 – 2012-08-16 00:32:00

相关问题