6

我首先使用Entity Framework 4.1代码,并且ASP.NET MVC 3和我正在努力正确地获取自引用设置。我有一个类别类。它必须是自我引用的。当表中的ParentCategoryId为空时,类别可以是父类别。如果一个类别有一个ParentCategoryId值,那么这意味着它属于一个父类别。实体框架4.1检索自引用数据

我在Code Project上跟着这个article

这里是我的分类等级:

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string MetaKeywords { get; set; } 
    public string MetaDescription { get; set; } 
    public bool IsActive { get; set; } 
    public virtual Category ParentCategory { get; set; } 
    public int? ParentCategoryId { get; set; } 
} 

我的上下文类:

public class PbeContext : DbContext 
{ 
    public DbSet<Category> Categories { get; set; } 

    protected override void OnModelCreating(DbModelBuilder dbModelBuilder) 
    { 
      dbModelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

      dbModelBuilder.Entity<Category>() 
       .HasOptional(c => c.ParentCategory) 
       .WithMany() 
       .HasForeignKey(p => p.ParentCategoryId); 
    } 
} 

不知道上面是正确的吗?

有人能帮我解决这个问题吗?我需要的是,当我通过id查询一个类别时,它必须带回父类别(只在需要时加载)。它也必须加载任何子类别(仅在需要时)。我还没有为子类别的类别类添加一个列表。

上面的问题看起来像检索父类别和子类别的类别?

编辑

这是我找回我的类别:

public Category GetById(int id) 
{ 
    return db 
      .Categories 
      .Find(id); 
} 

因为ParentCategory参考可以为空,我将如何在视图中显示这个?我有以下内容:

@Model.ParentCategory.Name 

..但不会给出错误,如果该类别没有与其关联的父类别?我如何在视图中显示它?

回答

7

如果您需要访问子类可以集合属性添加到模型

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string MetaKeywords { get; set; } 
    public string MetaDescription { get; set; } 
    public bool IsActive { get; set; } 
    public virtual Category ParentCategory { get; set; } 
    public int? ParentCategoryId { get; set; } 
    public virtual ICollection<Category> ChildCategories{ get; set; } 
} 

然后你可以设置的模型

 dbModelBuilder.Entity<Category>() 
      .HasOptional(c => c.ParentCategory) 
      .WithMany(c => ChildCategories) 
      .HasForeignKey(p => p.ParentCategoryId); 

编辑

你应该检查ParentCategory是否为空。

@if(Model.ParentCategory != null){ 
    <div>@Model.ParentCategory.Name</div> 
} 
+0

谢谢。你的查询看起来像什么来检索数据? –

+0

请看我编辑的文章:) –

+0

@Brendan编辑答案 – Eranga