首页 > 解决方案 > 实体框架核心中的自联接

问题描述

我有一Category堂课。它也是一个自加入。我使用了存储库模式。使用存储库可以很好地获取、插入或更新数据。但是当我想从关系实体中获取数据时,它不起作用。它抛出这个错误:

你调用的对象是空的

但是,当我使用它获取数据时,DbContext它工作正常。

public class Category
{
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        public int? CategoryId { get; set; }

        //Navigation
        public Category Parent { get; set; }
        public virtual ICollection<Category> Children { get; set; }
}

自加入的配置

builder.HasMany(x => x.Children)
                .WithOne(x => x.Parent)
                .HasForeignKey(g => g.CategoryId);

用于获取所有数据的存储库类

public IEnumerable<TEntity> GetAll()
{
    return Context.Set<TEntity>().AsEnumerable();
}

[HttpGet]
public JsonResult LoadCategory()
{
     var categories = unitOfWork.Category
                                .GetAll()
                                .ToList()
                                .Select(x => new
                                             {
                                                  Id = x.Id,
                                                  Name = x.Name,
                                                  CategoryName = x.Parent.Name
                                             }).ToList();
    return Json(categories);
}

在最后一种方法中,我得到了错误,但是当我使用

ProductDbContext db = new ProductDbContext();

然后它工作。

标签: c#asp.net

解决方案


我发现了问题。CategoryId 可以为空。因此,如果任何项目 CategoryId 为空,则它会引发错误。我只是检查如果 null 那么 neme 将是空白的。

var categories = unitOfWork.Category
                           .GetAll()
                           .Select(x => new
                                         {
                                           Id = x.Id,
                                           Name = x.Name,
                                           CategoryName = x.CategoryId == null ? "" : x.Parent.Name

                                         }).ToList();

推荐阅读