.NET 6中AutoMapper注册替换this.GetType()遇对象循环引用错误
问题解决:.NET6中AutoMapper注册与Json循环引用错误
一、修复AutoMapper注册问题
在.NET6的Program.cs里,Main是静态方法,无法使用this.GetType(),你需要替换为当前程序集的类型引用,两种可行方式:
// 方式1:通过Program类获取程序集 builder.Services.AddAutoMapper(typeof(Program).Assembly); // 方式2:直接指定映射配置类的程序集(更精准) builder.Services.AddAutoMapper(typeof(HotelsMappingProfile).Assembly);
以上两种写法都能让AutoMapper扫描到你定义的HotelsMappingProfile配置类。
二、解决Json循环引用错误
你碰到的JsonException: A possible object cycle was detected错误,主要由两个问题导致,对应修复方案如下:
- 控制器返回类型不匹配
在Get(int id)方法中,返回类型声明为ActionResult<Hotels>,但实际返回的是HotelsDto,这会引发序列化时的意外循环引用。
修复:把返回类型改为ActionResult<HotelsDto>:[HttpGet("{id}")] public ActionResult<HotelsDto> Get([FromRoute] int id) { var hotels = _dbcontext .Hotels .Include(r => r.Address) .Include(r => r.Rooms) .FirstOrDefault(h => h.Id == id); if (hotels == null) { return NotFound(); } var hotelsDtos = _mapper.Map<HotelsDto>(hotels); return Ok(hotelsDtos); } - DTO间存在循环引用
如果RoomsDto包含HotelsDto引用,同时HotelsDto包含List<RoomsDto>,序列化时会产生循环。
可选修复方案:- 方案1:移除DTO中不必要的反向引用,比如
RoomsDto里不需要保留关联的Hotel字段; - 方案2:配置Json序列化忽略循环引用,在
Program.cs中添加:builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; });
- 方案1:移除DTO中不必要的反向引用,比如
完整修复后的Program.cs核心片段
var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; }); builder.Services.AddDbContext<HotelsDbContext>(); builder.Services.AddScoped<HotelsSeeder>(); // 替换原有的AutoMapper注册代码 builder.Services.AddAutoMapper(typeof(Program).Assembly); // 后续管道配置代码不变...
内容的提问来源于stack exchange,提问作者Insikt
相关产品推荐
相关产品推荐

