ASP.NET Core(.NET 6)中如何显示分类名称而非ID?
解决书籍索引页显示分类ID而非名称的问题
1. 检查实体类关联定义
确保你的Book实体类同时保留外键字段和分类导航属性:
public class Book { // 其他书籍属性 public int CategoryId { get; set; } // 关联分类的外键 public Category Category { get; set; } // 分类导航属性 }
同时Category实体类需要添加反向导航属性:
public class Category { public int Id { get; set; } public string Name { get; set; } public ICollection<Book> Books { get; set; } = new List<Book>(); // 关联书籍集合 }
2. 确认DbContext中的关系配置
在数据库上下文类中,通过Fluent API明确配置书籍与分类的一对多关系:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Book>() .HasOne(b => b.Category) .WithMany(c => c.Books) .HasForeignKey(b => b.CategoryId); }
3. 查询时显式加载分类数据
在Books控制器的Index动作方法中,必须用Include方法加载关联的分类数据(EF Core默认不会自动加载导航属性):
public async Task<IActionResult> Index() { var books = _context.Books.Include(b => b.Category).ToListAsync(); return View(await books); }
4. 修改视图显示逻辑
在书籍Index视图里,把显示分类ID的代码替换为显示分类名称:
<!-- 原代码 --> <td>@item.CategoryId</td> <!-- 修改后代码 --> <td>@(item.Category?.Name ?? "未分类")</td>
用空条件运算符?.和空合并运算符??,避免因分类数据未加载导致的空引用异常。
5. 修正错误的迁移操作
不要手动修改Migrations文件,按以下流程更新:
- 修改实体类和DbContext配置后,在Package Manager Console执行:
Add-Migration UpdateBookCategoryRelation - 再更新数据库:
Update-Database
内容的提问来源于stack exchange,提问作者Trần Quang Khải
相关产品推荐
相关产品推荐

