You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Entity Framework查询关联表数据时CategoryName字段为null的解决求助

解决查询关联表时CategoryName字段为null的问题

问题现象

查询关联表数据时,返回的ProductDto中CategoryName字段始终为null,相关代码如下:

实体类代码

public class Product
{
    [Key]
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public string Description { get; set; }
    public double Price { get; set; }

    public int CategoryID { get; set; }
    [ForeignKey("CategoryID")]
    public virtual Category Category { get; set; }
}

public class Category
{
    [Key]
    public int CategoryID { get; set; }
    public string CategoryName { get; set; }
}

控制器代码

public async Task<IEnumerable<ProductDto>> GetProductsAsync()
{
    List<Product> products = await _db.Products
                                      .Include(u => u.Category)
                                      .ToListAsync();
    return _mapper.Map<List<ProductDto>>(products);
}

DTO与映射配置

public class ProductDto
{
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public string Description { get; set; }
    public double Price { get; set; }
    public string CategoryName { get; set; }
}

public class MappingProfiles : Profile
{
    public MappingProfiles()
    {
        CreateMap<ProductDto, Product>().ReverseMap();
    }
}

解决方案

1. 显式配置AutoMapper映射规则

AutoMapper默认无法自动识别从Product.Category.CategoryName到ProductDto.CategoryName的嵌套映射关系,需在配置中明确指定:

public class MappingProfiles : Profile
{
    public MappingProfiles()
    {
        CreateMap<Product, ProductDto>()
            .ForMember(dest => dest.CategoryName, opt => opt.MapFrom(src => src.Category.CategoryName))
            .ReverseMap();
    }
}

2. 使用EF投影查询直接构造DTO

跳过AutoMapper,直接在EF查询阶段通过Select投影生成ProductDto,确保关联字段被正确获取:

public async Task<IEnumerable<ProductDto>> GetProductsAsync()
{
    var products = await _db.Products
        .Select(p => new ProductDto
        {
            ProductID = p.ProductID,
            ProductName = p.ProductName,
            Description = p.Description,
            Price = p.Price,
            CategoryName = p.Category.CategoryName
        })
        .ToListAsync();
    return products;
}

3. 验证数据库数据完整性

确认数据库中:

  • 每个Product的CategoryID都对应存在的Category记录
  • 对应Category的CategoryName字段不为null或空值

内容的提问来源于stack exchange,提问作者Leonid Nisanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:05:23