用于.NET的基于约定的基于对象的对象映射器和转换器
公开课人 { 名字{得到;放; } IEnumerable 地址 { get;放; } } 公共类 PersonModel { 名字{得到;放; } IEnumerable 地址 { ... public class Person { Name { get; set; } IEnumerable<Address> Addresses { get; set; } } public class PersonModel { Name { get; set; } IEnumerable<AddressModel> Addresses { get; set; } } 如果我像这样将Person映射到PersonModel: Mapper.DynamicMap<Person, PersonModel>(person); 如果 Addresses 上的 Person 属性为空,则它们在 PersonModel 上映射为空 Enumerable 而不是空值。 如何让 PersonModel 具有空的 Addresses 而不是空的 Enumerable? 简单的答案是使用AllowNullCollections: AutoMapper.Mapper.Initialize(cfg => { cfg.AllowNullCollections = true; }); 或者如果您使用实例 API new MapperConfiguration(cfg => { cfg.AllowNullCollections = true; } 除了在映射器配置初始化中设置AllowNullCollections(如this answer中所述),您还可以选择在AllowNullCollections定义中设置Profile,如下所示: public class MyMapper : Profile { public MyMapper() { // Null collections will be mapped to null collections instead of empty collections. AllowNullCollections = true; CreateMap<MySource, MyDestination>(); } } 所以可能有几种方法可以使用 Automapper 完成此操作,这只是其中一种: Mapper.CreateMap<Person, PersonMap>() .AfterMap( (src, dest) => dest.Addresses = dest.Addresses?.Any() ? dest.Addresses : null ); 此代码使用新的 c# ?. 运算符来实现空安全,因此如果您不能在代码中使用该功能,则可能需要删除它并检查是否为空。 另一种替代方法是使用条件,因此仅在值不为空时映射值。 这可能需要该值默认为空(因为它不会被映射) Mapper.CreateMap<Person, PersonModel>() .ForMember( dest => dest.Addresses, opt => opt => opt.Condition(source=> source.Addresses!= null)); 您应该能够为您想要此行为的属性定义自定义解析器。所以像: Mapper.CreateMap<Address, AddressModel>(); Mapper.CreateMap<Person, PersonModel>() .ForMember( dest => dest.Addresses, opt => opt.ResolveUsing(person => person.Addresses.Any() ? person.Addresses.Select(Mapper.Map<Address, AddressModel>) : null)); 如果您希望将此作为 API 中的一般规则,您可以像这样在配置服务方法中配置 Automapper。 public void ConfigureServices(IServiceCollection services) { services.AddCors(); services.AddControllers(); [...] // configure automapping services.AddAutoMapper(cfg => cfg.AllowNullCollections = true, typeof(Startup)); } 或者,在单独的 DLL 中使用自动映射的情况下(例如:对于 DTO 服务),我更喜欢使用辅助函数,所以配置也应该在那里完成: public static class MappingHelper { private static readonly Lazy<IMapper> _lazy = new(() => { var config = new MapperConfiguration(cfg => { // This line ensures that internal properties are also mapped over. cfg.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly; cfg.AddProfile<DomainToRepositoryProfile>(); cfg.AddProfile<RepositoryToDomainProfile>(); cfg.AllowNullCollections = true; }); var mapper = config.CreateMapper(); return mapper; }); public static IMapper Mapper => _lazy.Value; } 我无法使用 AutoMapper 12.0.1 和 Entity Framework Core 6.0.15 脚手架实体让 AllowNullCollections 与 net6 一起工作。唯一有效的方法是: internal class UserDtoMapper : Profile { public UserDtoMapper() { CreateMap<User, UserDto>() .ForMember(dest => dest.Votes, x => x.Condition(src => src.Votes != null && src.Votes.Any())) .ReverseMap(); } } public partial class User { // ... public virtual ICollection<Vote> Votes { get; set; } } public class UserDto { // ... public List<VoteDto>? Votes { get; set; } }
下面是两个实体 公共类用户 { public int UId { 得到;放; } 公共字符串 UName { 得到;放; } = 空! 公共字符串 UUsername { get;放; } = 空! ...
Automapper: System.InvalidOperationException: 'Coalesce used with type that cannot be null'
尝试在单元测试中使用映射器配置文件时出现此错误 错误: System.InvalidOperationException:'Coalesce 与不能为 null 的类型一起使用' 堆栈跟踪: 在 System.Linq.Express...
我遇到上面的情况,我收到一个具有很多属性和两个嵌套 DTO 的 JSON 对象 (PreSalesDTO),我需要将它们映射到实际模型并将它们存储在不同的
我有两个枚举。一个比另一个具有更多的价值。我想在删除缺失值的同时将一个映射到另一个。 公共枚举 Person1ColoursEnum { 蓝色 = 1 红色 = 2 } 公共枚举
“LINQ 表达式‘DbSet’...”-EF Core + AutoMapper
当我尝试通过 AutoMapper 将数据转换为另一种类型时,我得到以下函数: System.InvalidOperationException:LINQ 表达式 'DbSet() 系统.
我通过 Aftermap 向配置文件映射器发送一个值。 var provinces = await _repository.AsQueryable().ToListAsync(); var result = provinces.Select(item => _mapper.Map(item, x...
我有以下结构,我想将 Parent.StockNumber 分配给 Supplier.StockNumber。由于 Supplier 是数组,我不确定如何在 Automapper 中使用 .ForEach。 代码: 公开课家长...
如何使用 AutoMapper 创建从开放泛型到简单泛型的自定义类型转换器?
我有一个从函数式程序语言实现选项 monad 的类。实现非常简单: 公开课 Maybe : IMaybe { 公共 T 值 { 得到;放; } =
ComponentNotRegisteredException 使用 AutoMapper 和 Autofac
尝试解析 AutoMapper.IMapper 实例时出现错误: Autofac.Core.Registration.ComponentNotRegisteredException:请求的服务“System.Object”尚未注册...
配置 Automapper 以相同的方式映射给定类的所有字符串
源对象中的所有字符串均以逗号分隔。我希望避免代码重复并使 Automapper 以相同的方式处理所有字符串属性。 我是这样实现的: 创建地图<
我正在寻找一种方法来从属性名称与给定字符串数组中的属性名称匹配的对象构建匿名类型。就像是: //当前方式: var anonObject = primaryObject.Sel...
AutoMapper - 将 dto 和模型列表合并到另一个 dto
我有以下两个模型: 公共课员工 { public int UserId { 得到;放; } 公共字符串显示名称 { 得到;放; } } 公共类公司 { public int CompanyId { 得到;放; ...
我正在使用 AutoMapper,当我更新单个值时,它会使其余值变为空
我正在使用 AutoMapper,这是我更新现有客户详细信息的代码,但是当我更新一个字段时,其余字段将被清空。 公共异步任务更新(
我有一个 OverridableValue 类来表示可以手动覆盖的值(包含一个 T Value 道具和一个布尔值,用于判断它是否是手动的)。这个类在我的界面中使用...
当目标包含 JArray 属性时无论如何要使用 Automapper?
假设我有一个源 JObject: var source = 新的 JObject { { "XCV", Guit.NewGuid().ToString() }, { "s...
AutoMapper和JsonPatchDocument的运行路径
我们正在使用 .NET Core 3.1、Microsoft.AspNetCore.JsonPatch 3.1.27 和 AutoMapper 12.0.1。 我们正在开发一个 REST API。它公开了一些用于使用 HTTP PATCH 动词更新实体的端点。这些
API.Helpers.ProductUrlResolver' 不能用作泛型类型或方法 'IMemberConfigurationExpression
这是我的“ProductUrlResolver”类 这是我的“MappingProfiles”类,我在屏幕截图中提到的行中遇到错误。它说 类型 'API.Helpers.ProductUrlRe...
什么是使用列表映射的正确方法(EF 核心 + AutoMapper.Collection)
引自 https://github.com/AutoMapper/AutoMapper.Collection 页面: 将 OrderDTO 映射回 Order 将根据 ID 是否匹配来比较 Order 项目列表 Mapper.Map(orderDtos,