自我加入实体框架核心

问题描述 投票:2回答:2

我有一个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
2个回答
0
投票

LoadCategory无法正常工作?假设您创建db的新实例作为常规,在顶部;如果有用的话就这样使用?试试这个;

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

0
投票

我发现了问题。 CategoryId为null。因此,如果任何项目CategoryId为null,则抛出错误。我只检查null是否为neme将为空。

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

                                         }).ToList();
© www.soinside.com 2019 - 2024. All rights reserved.