C# Automapper未映射关联对象问题咨询
嘿,我来帮你排查这个问题!你说AutoMapper成功映射了CompanyId但没映射关联的Company对象,这在实际开发里挺常见的,我给你梳理几种最可能的情况和解决办法:
首先检查你的DTO定义
如果你的LocationDto里压根没加Company相关的属性,那AutoMapper肯定不会平白无故给你映射出来啊!比如你要是想把Location里的Company对象信息也带到DTO里,得先给LocationDto加个对应的属性(比如CompanyDto类型):
public class LocationDto { public int Id { get; set; } public string Name { get; set; } public int? CompanyId { get; set; } public CompanyDto Company { get; set; } // 新增这个属性,对应实体的Company }
然后别忘了在AutoMapper配置里明确这个映射关系(如果已经有Company到CompanyDto的映射,AutoMapper会自动递归处理,不用额外写细节):
CreateMap<Location, LocationDto>() .ForMember(dest => dest.Company, opt => opt.MapFrom(src => src.Company));
如果DTO已经有Company属性但映射后是null
那大概率是下面这几个原因:
EF Core没加载Company导航属性:如果你用的是EF Core,查询
Location的时候得手动Include关联的Company,不然EF默认不会主动加载它(除非开了懒加载):// 一定要加Include,不然Location.Company就是null var location = dbContext.Locations.Include(l => l.Company).FirstOrDefault(l => l.Id == yourId);要是没加
Include,原实体的Company都是null,AutoMapper当然映射不出东西。AutoMapper配置不小心忽略了Company属性:检查你的映射配置,是不是写了类似这样的代码?
CreateMap<Location, LocationDto>() .ForMember(dest => dest.Company, opt => opt.Ignore()); // 要是有这个就删掉!这种配置会直接忽略
Company属性的映射,去掉就行。懒加载导致的上下文释放问题:如果开了EF的懒加载,但映射的时候数据库上下文已经被Dispose了,那访问
Location.Company要么报错要么返回null。这种情况要么查询时提前Include,要么确保映射时上下文还在活跃状态。
要是你是从DTO映射到实体,想根据CompanyId自动获取Company对象
AutoMapper本身只是个对象拷贝工具,不会自动去数据库查数据。如果想让它根据CompanyId把对应的Company实体赋值给Location.Company,可以用AfterMap来手动处理:
CreateMap<LocationDto, Location>() .AfterMap((src, dest, context) => { if(src.CompanyId.HasValue) { // 这里需要注入你的DbContext或者仓储来查询Company var dbContext = context.GetInstance<YourDbContext>(); dest.Company = dbContext.Companies.Find(src.CompanyId.Value); } });
注意这里要确保AutoMapper能获取到你的数据库上下文,可能需要在映射时传入或者通过依赖注入处理。
内容的提问来源于stack exchange,提问作者Dabagab

