EF Core插入报错:不支持System.Action实例的序列化与反序列化
问题解析与解决方案
报错原因
Serialization and deserialization of 'System.Action' instances are not supported. Path: $.MoveNextAction 这个错误的核心是序列化器尝试处理包含无法序列化的System.Action的对象,通常是EF Core延迟加载代理中的延迟加载委托,或是异步方法状态机被意外纳入序列化流程。结合你的代码场景,大概率是被EF跟踪的实体(或其代理对象)在映射为DTO后,被JSON序列化器处理时触发了延迟加载逻辑,导致代理中的Action被尝试序列化。
解决方案
1. 检查并调整DTO与AutoMapper配置
查看CampaignDetialDto是否包含UserCampaigns这类无需返回的导航属性:
- 如果不需要该属性,直接从DTO中移除;
- 如果必须保留,在AutoMapper配置中显式忽略实体的导航属性,避免映射EF跟踪的集合:
// AutoMapper配置示例 CreateMap<Campaign, CampaignDetialDto>() .ForMember(dest => dest.UserCampaigns, opt => opt.Ignore());
2. 分离EF上下文跟踪的实体
在仓储的AddAsync方法中,保存数据后将实体从EF上下文的跟踪状态中分离,避免返回的实体携带包含Action的EF代理对象:
public async Task<T> AddAsync(T entity) { await _context.AddAsync(entity); await _context.SaveChangesAsync(); // 分离主实体 _context.Entry(entity).State = EntityState.Detached; // 分离关联的Campaign实体(如果需要) if (entity is UserCampaign userCampaign) { _context.Entry(userCampaign.Campaign).State = EntityState.Detached; } return entity; }
3. 禁用EF Core延迟加载
如果你的业务场景不需要延迟加载,在上下文注册时明确禁用,避免生成包含Action的代理对象:
public static IServiceCollection AddApplicationPostGresContext(this IServiceCollection services, IConfiguration _config) { services.AddDbContext<PostGresContext>(options => { options.UseNpgsql(_config.GetConnectionString("PostGresConnectionString")) .UseLazyLoadingProxies(false); // 禁用延迟加载代理 }); return services; }
4. 规范实体初始化逻辑(可选)
将Campaign类的字段级初始化改为构造函数初始化,避免可能的初始化逻辑干扰(非直接报错原因,但可提升代码规范性):
public class Campaign { public Campaign() { Name = string.Empty; Description = string.Empty; CreateDate = DateTime.UtcNow; Active = ActiveStateEnum.Active; } // 其他属性... }
内容的提问来源于stack exchange,提问作者TheBlueNight
相关产品推荐
相关产品推荐

