我首先使用Entity Framework 4.1代码和ASP.NET MVC 3,我正在努力使我的自我引用设置正确。我有一个Category类。它必须是自我引用的。当表中的ParentCategoryId为null时,类别可以是父类别。如果某个类别的ParentCategoryId具有值,则表示它属于父类别。
我在代码项目上遵循了这个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引用可以为null,我将如何在视图中显示它?我有以下内容:
@Model.ParentCategory.Name
..如果该类别没有与之关联的父类别,它是否会出错?我如何在视图中显示它?
答案 0 :(得分: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>
}