using AutoMapper; using AutoMapper.Internal.Mappers; using Entities.Contracts; using Entities.DTO; namespace TechHelper.Context { public class AutoMapperProFile : Profile { public static class EnumMappingHelpers { public static TEnum ParseEnumSafe(string sourceString, TEnum defaultValue) where TEnum : struct, Enum { if (Enum.TryParse(sourceString, true, out TEnum parsedValue)) { return parsedValue; } return defaultValue; } } public AutoMapperProFile() { CreateMap() .ForMember(dest => dest.Id, opt => opt.Ignore()) // ID由IdentityUser生成 .ForMember(dest => dest.UserName, opt => opt.MapFrom(src => src.Name)) // 或者 MapFrom(src => src.Name) .ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.Email)) .ForMember(dest => dest.PhoneNumber, opt => opt.MapFrom(src => src.PhoneNumber)) .ForMember(dest => dest.Address, opt => opt.MapFrom(src => src.HomeAddress)) // 映射到 IdentityUser 的 Address 属性 .ForMember(dest => dest.PasswordHash, opt => opt.Ignore()) // 密码哈希由 UserManager 处理 .ForMember(dest => dest.EmailConfirmed, opt => opt.Ignore()); // 邮箱确认状态由服务层处理 CreateMap() .ForMember(d => d.Number, o => o.MapFrom(src => src.Class)).ReverseMap(); CreateMap() .ForMember(dest => dest.Id, opt => opt.Ignore()) .ForMember(dest => dest.QuestionText, opt => opt.MapFrom(src => src.Stem)) .ForMember(dest => dest.CorrectAnswer, opt => opt.MapFrom(src => src.SampleAnswer)) .ForMember(dest => dest.QuestionType, opt => opt.MapFrom(src => EnumMappingHelpers.ParseEnumSafe(src.QuestionType, QuestionType.Unknown))) .ForMember(dest => dest.DifficultyLevel, opt => opt.MapFrom(src => EnumMappingHelpers.ParseEnumSafe(src.DifficultyLevel, DifficultyLevel.easy))) .ForMember(dest => dest.SubjectArea, opt => opt.MapFrom(src => EnumMappingHelpers.ParseEnumSafe(src.DifficultyLevel, SubjectAreaEnum.Unknown))) .ForMember(dest => dest.CreatedBy, opt => opt.Ignore()) .ForMember(dest => dest.CreatedAt, opt => opt.Ignore()) .ForMember(dest => dest.UpdatedAt, opt => opt.Ignore()) .ForMember(dest => dest.IsDeleted, opt => opt.Ignore()); // 2. Question -> SubQuestionDto (查看时) CreateMap() .ForMember(dest => dest.Stem, opt => opt.MapFrom(src => src.QuestionText)) .ForMember(dest => dest.Score, opt => opt.Ignore()) // Question 实体没有 Score 字段,需要从 AssignmentQuestion 获取 .ForMember(dest => dest.SampleAnswer, opt => opt.MapFrom(src => src.CorrectAnswer)) .ForMember(dest => dest.QuestionType, opt => opt.MapFrom(src => src.QuestionType.ToString())) .ForMember(dest => dest.DifficultyLevel, opt => opt.MapFrom(src => src.DifficultyLevel.ToString())) .ForMember(dest => dest.Options, opt => opt.Ignore()); // Options 需要单独处理 CreateMap() .ForMember(dest => dest.AssignmentTitle, opt => opt.MapFrom(src => src.Title)) .ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.Description)) .ForMember(dest => dest.AssignmentId, opt => opt.MapFrom(src => src.Id)) .ForMember(dest => dest.QuestionGroups, opt => opt.MapFrom(src => src.AssignmentGroups.FirstOrDefault(ag => ag.ParentGroup == null))) .ForMember(dest => dest.SubjectArea, opt => opt.MapFrom(src => src.SubjectArea.ToString())); CreateMap() .ForMember(dest => dest.SubQuestionGroups, opt => opt.MapFrom(src => src.ChildAssignmentGroups)) .ForMember(dest => dest.SubQuestions, opt => opt.MapFrom(src => src.AssignmentQuestions)); CreateMap() .ForMember(dest => dest.Stem, opt => opt.MapFrom(src => src.Question.QuestionText)) .ForMember(dest => dest.SampleAnswer, opt => opt.MapFrom(src => src.Question.CorrectAnswer)) .ForMember(dest => dest.QuestionType, opt => opt.MapFrom(src => src.Question.QuestionType.ToString())) .ForMember(dest => dest.DifficultyLevel, opt => opt.MapFrom(src => src.Question.DifficultyLevel.ToString())); CreateMap() .ForMember(dest => dest.ChildAssignmentGroups, opt => opt.MapFrom(src => src.SubQuestionGroups)) .ForMember(dest => dest.AssignmentQuestions, opt => opt.MapFrom(src => src.SubQuestions)); CreateMap() .ForMember(dest => dest.Question, opt => opt.MapFrom(src => src)); // 映射到嵌套的 Question 对象 CreateMap() .ForMember(dest => dest.ChildQuestionGroups, opt => opt.MapFrom(src => src.SubQuestionGroups)) .ForMember(dest => dest.Title, opt => opt.MapFrom(src => src.Title)) .ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.Descript)); CreateMap(); } } }