给出以下实体模型:
public class Workshop
{
public Guid Id { get; set; }
public string Name { get; set; }
public ICollection<QuoteRequest> QuoteRequests { get; set; }
}
public class QuoteRequest
{
public Guid Id { get; set; }
public Guid CustomerId { get; set; }
public Guid WorkshopId { get; set; }
public bool Responded { get; set; }
public decimal? Amount { get; set; }
public virtual Customer Customer { get; set; }
public virtual Workshop Workshop { get; set; }
}
和以下两个视图模型:
public class WorkshopModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public ICollection<QuoteRequestModel> QuoteRequests { get; set; }
}
public class QuoteRequestModel
{
public Guid Id { get; set; }
public Guid CustomerId { get; set; }
public Guid WorkshopId { get; set; }
public bool Responded { get; set; }
public decimal? Amount { get; set; }
public CustomerModel Customer { get; set; }
public WorkshopModel Workshop { get; set; }
}
接下来,给出以下查询:
public async Task<Workshop> GetWorkshopAsync(Guid id, bool includeQuotes = false)
{
IQueryable<Workshop> query = _context.Workshops;
if (includeQuotes)
{
query = query.Include(w => w.QuoteRequests);
}
return await query.FirstOrDefaultAsync(w => w.Id == id);
}
无论我做什么,在查询Workshop
时,我都无法获得EF来不给我循环关系。例如,我查询一个具有14个Workshop
的QuoteRequests
,每个都有一个Workshop
,每个都有14个QuoteRequests
等,等等::>
我确实将json序列化程序参考循环处理设置设置为忽略,但这没有给我想要的结果
services.AddControllers() .AddNewtonsoftJson(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
因此,我想在我的地图资料中删除该圆圈。我正在使用自动映射器。我已经从
QuoteRequest
端用映射配置文件打破了循环引用:
CreateMap<QuoteRequestModel, QuoteRequest>() .ForMember(dest => dest.Customer, opt => opt.MapFrom(src => src.Customer)) .ForMember(dest => dest.Workshop, opt => opt.MapFrom(src => src.Workshop)) .ForPath(dest => dest.Customer.QuoteRequests, opt => opt.MapFrom(src => new List<QuoteRequest>())) .ForPath(dest => dest.Workshop.QuoteRequests, opt => opt.MapFrom(src => new List<QuoteRequest>())); CreateMap<QuoteRequest, QuoteRequestModel>() .ForMember(dest => dest.Customer, opt => opt.MapFrom(src => src.Customer)) .ForMember(dest => dest.Workshop, opt => opt.MapFrom(src => src.Workshop)) .ForPath(dest => dest.Customer.QuoteRequests, opt => opt.MapFrom(src => new List<QuoteRequestModel>())) .ForPath(dest => dest.Workshop.QuoteRequests, opt => opt.MapFrom(src => new List<QuoteRequestModel>()));
这可能是一个简单的解决方案,但是当我查询一个单独的
QuoteRequest
时,它现在可以正常工作。我想弄清楚的是,如何从Workshop
端在映射配置文件中执行相同的操作:
CreateMap<WorkshopModel, Workshop>() .ForMember(dest => dest.QuoteRequests, opt => opt.MapFrom(src => src.QuoteRequests)); CreateMap<Workshop, WorkshopModel>() .ForMember(dest => dest.QuoteRequests, opt => opt.MapFrom(src => src.QuoteRequests));
我不能真正地以
QuoteRequests
的每次迭代为目标来将Workshop
设置为默认值。
给出以下实体模型:public class Workshop {public Guid ID {get;组; } public string Name {get;组; } public ICollection
这不是问题。您所看到的是EF的对象修复。因为它的对象缓存中已经包含这些实体,所以它会自动“修复”每个实体上的关系,而无需再次查询任何内容。