c# - 实体框架核心中的自联接
问题描述
我有一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();
然后它工作。
解决方案
我发现了问题。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();
推荐阅读
- amazon-web-services - 将来自另一个 AWS 账户的安全组中的特定 AWS 账户的所有 EC2 实例列入白名单
- android - 从 AppWidgetHostView 中提取元素
- r - 在 dplyr 中,如何通过可能存在或不存在的列连接数据框?
- css - dash_daq BooleanSwitch 因 Dash Bootstrap 组件的边框而失败
- list - 创建列表
来自列表 - git - 简单的 git bug 修复过程
- python - 通过 super() 覆盖构造函数,提供更少的父构造函数所需的参数
- parsing - 如何跨模型实例定义碰撞过滤器组?
- multithreading - 默认情况下为什么没有设置线程化 perl(带有 usethreads)?
- r - 如何在 R Markdown 中修复此错误代码?