实体框架4.1检索自引用数据

Bre*_*ogt 6 entity-framework entity-framework-4 entity-framework-4.1 asp.net-mvc-3

我首先使用Entity Framework 4.1代码和ASP.NET MVC 3,我正在努力使我的自引用设置正确.我有一个Category类.它必须是自我引用的.当表中的ParentCategoryId为null时,类别可以是父类别.如果某个类别的ParentCategoryId具有值,则表示它属于父类别.

我遵循了关于代码项目的这篇文章.

这是我的Category类:

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; }
}
Run Code Online (Sandbox Code Playgroud)

我的上下文类:

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);
     }
}
Run Code Online (Sandbox Code Playgroud)

不确定以上是否正确?

有人可以帮我解决这个问题吗?我需要的是,当我按ID查询类别时,它必须带回父类别(仅在需要时加载).此外,它必须加载任何子类别(仅在需要时).我还没有为子类别的类别类添加列表.

上述问题与父类别和子类别一起检索类别会是什么样的?

编辑

这是我检索我的类别的方法:

public Category GetById(int id)
{
     return db
          .Categories
          .Find(id);
}
Run Code Online (Sandbox Code Playgroud)

因为ParentCategory引用可以为null,我将如何在视图中显示它?我有以下内容:

@Model.ParentCategory.Name
Run Code Online (Sandbox Code Playgroud)

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

Era*_*nga 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; }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以将模型设置为

      dbModelBuilder.Entity<Category>()
           .HasOptional(c => c.ParentCategory)
           .WithMany(c => ChildCategories)
           .HasForeignKey(p => p.ParentCategoryId);
Run Code Online (Sandbox Code Playgroud)

编辑

您应该检查是否ParentCategory为null.

@if(Model.ParentCategory != null){
  <div>@Model.ParentCategory.Name</div>
}
Run Code Online (Sandbox Code Playgroud)