Обновите 1-13-10, я смог найти некоторый успех с помощью кода ниже для отображения. Я по существу игнорирую любое из свойств, которые не имеют отображения и отображения их впоследствии. Я ценил бы обратную связь относительно того, иду ли я об этом возможным лучшим способом. Кроме того, я не уверен, как пойти о поблочном тестировании это отображение. Это было мое впечатление, что использование AutoMapper должно помочь облегчить скуку проверки каждого свойства.
Вот мой новый код:
Mapper.CreateMap<MoveEntity, MoveEntityDto>()
.ForMember(dest => dest.PrimaryOriginTransferee, opt => opt.Ignore())
.ForMember(dest => dest.PrimaryDestinationTransferee, opt => opt.Ignore())
.ForMember(dest => dest.Customer, opt => opt.Ignore())
.ForMember(dest => dest.DestinationAddress, opt => opt.Ignore())
.ForMember(dest => dest.OriginAddress, opt => opt.Ignore())
.ForMember(dest => dest.Order, opt => opt.Ignore())
.ForMember(dest => dest.Shipment, opt => opt.Ignore())
.ForMember(dest => dest.SourceSystemName, opt => opt.Ignore());
Mapper.CreateMap<ContactEntity, TransfereeEntityDto>();
Mapper.CreateMap<CustomerEntity, CustomerEntityDto>();
Mapper.CreateMap<AddressEntity, AddressEntityDto>();
Mapper.CreateMap<OrderEntity, OrderEntityDto>()
.ForMember(dest => dest.OrderForwarding, opt => opt.Ignore())
.ForMember(dest => dest.Forwarder, opt => opt.Ignore());
Mapper.CreateMap<ShipmentEntity, ShipmentEntityDto>()
.ForMember(dest => dest.Services, opt => opt.Ignore());
Mapper.CreateMap<ServiceEntity, ServiceEntityDto>()
.ForMember(dest => dest.ServiceTypeCode, opt => opt.Ignore()) //TODO: ServiceTypeCode not being mapped, should it?
.ForMember(dest => dest.SourceSystemName, opt => opt.MapFrom(src => Enum.GetName(typeof(SourceSystemName), src.SourceSystemName)));
Mapper.CreateMap<OrderForwardingEntity, OrderForwardingEntityDto>();
Mapper.AssertConfigurationIsValid();
MoveEntityDto moveEntityDto = Mapper.Map<MoveEntity, MoveEntityDto>(moveEntity);
moveEntityDto.PrimaryDestinationTransferee = Mapper.Map<ContactEntity, TransfereeEntityDto>(moveEntity.PrimaryDestinationTransferee);
moveEntityDto.PrimaryOriginTransferee = Mapper.Map<ContactEntity, TransfereeEntityDto>(moveEntity.PrimaryOriginTransferee);
moveEntityDto.Customer = Mapper.Map<CustomerEntity, CustomerEntityDto>(moveEntity.Customer);
moveEntityDto.DestinationAddress = Mapper.Map<AddressEntity, AddressEntityDto>(moveEntity.DestinationAddress);
moveEntityDto.OriginAddress = Mapper.Map<AddressEntity, AddressEntityDto>(moveEntity.OriginAddress);
moveEntityDto.Order = Mapper.Map<OrderEntity, OrderEntityDto>(moveEntity.Order);
moveEntityDto.Order.OrderForwarding = Mapper.Map<OrderForwardingEntity, OrderForwardingEntityDto>(moveEntity.Order.OrderForwarding);
//moveEntityDto.Order.Forwarder = Mapper.Map<ForwarderEntity, ForwarderEntityDto>(moveEntity.Order.Forwarder); //Apparently there is no forwarder entity for an Order
moveEntityDto.Shipment = Mapper.Map<ShipmentEntity, ShipmentEntityDto>(moveEntity.Shipment);
moveEntityDto.Shipment.Services = Mapper.Map<ServiceEntity[], ServiceEntityDto[]>(moveEntity.Shipment.ServiceEntities);
Исходное сообщение:
Я пытаюсь использовать AutoMapper впервые для отображения от Объекта Bussiness до DTO. Я сталкиваюсь с проблемами, которые я не знаю, как диагностировать, включая следующее исключение:
AutoMapper. AutoMapperMappingException: Попытка отобразить Graebel. SP.BO.MoveEntity к Graebel. SOA.Contracts. DataContracts. SP.MoveEntity. Исключение типа 'AutoMapper. AutoMapperMappingException' был брошен
Вот Код AutoMapper, который я выполняю:
public MoveEntityDto MapMoveEntityToMoveEntityDto(MoveEntity moveEntity)
{
Mapper.CreateMap<MoveEntity, MoveEntityDto>()
.ForMember(dest => dest.PrimaryOriginTransferee, opt => opt.MapFrom(src => src.PrimaryOriginTransferee))
.ForMember(dest => dest.PrimaryDestinationTransferee,opt => opt.MapFrom(src => src.PrimaryDestinationTransferee))
.ForMember(dest => dest.Customer, opt => opt.MapFrom(src => src.Customer))
.ForMember(dest => dest.DestinationAddress, opt => opt.MapFrom(src => src.DestinationAddress))
.ForMember(dest => dest.Order, opt => opt.MapFrom(src => src.Order))
.ForMember(dest => dest.OriginAddress, opt => opt.MapFrom(src => src.OriginAddress))
.ForMember(dest => dest.Shipment, opt => opt.MapFrom(src => src.Shipment))
.ForMember(dest => dest.SourceSystemName, opt => opt.Ignore());
Mapper.AssertConfigurationIsValid();
MoveEntityDto moveEntityDto = Mapper.Map<MoveEntity, MoveEntityDto>(moveEntity);
return moveEntityDto;
}
Вот DTO (MoveEntityDto), который я пытаюсь отобразить:
public class MoveEntityDto
{
public bool IsOrderDetailPageModified { get; set; }
public bool IsRoutingPageModified { get; set; }
public bool IsServicePageModified { get; set; }
public bool IsContentAndContainerPageModified { get; set; }
public string FamilyRange { get; set; }
public string Office { get; set; }
public string ActivityType { get; set; }
public string ActivitySubject { get; set; }
public string ActivityNote { get; set; }
public TransfereeEntity PrimaryOriginTransferee { get; set; }
public TransfereeEntity PrimaryDestinationTransferee { get; set; }
public CustomerEntity Customer { get; set; }
public AddressEntity OriginAddress { get; set; }
public AddressEntity DestinationAddress { get; set; }
public OrderEntity Order { get; set; }
public ShipmentEntity Shipment { get; set; }
public string PortalId { get; set; }
public string SourceSystemId { get; set; }
public EnterpriseEnums.SourceSystemName SourceSystemName { get; set; }
public MoveEntity()
{
PrimaryOriginTransferee = new TransfereeEntity();
PrimaryDestinationTransferee = new TransfereeEntity();
Customer = new CustomerEntity();
OriginAddress = new AddressEntity();
DestinationAddress = new AddressEntity();
Order = new OrderEntity();
Shipment = new ShipmentEntity();
}
public bool HasShipment()
{
if (Shipment.ExternalShipmentId > 0)
{
return true;
}
return false;
}
}
Вот Бизнес-объект (MoveEntity), от которого я пытаюсь отобразиться
public class MoveEntity
{
public int SourceId { get; set; }
public int MoveId { get; set; }
public bool IsOrderDetailPageModified { get; set; } // TODO: Internal - Remove from data contract
public bool IsRoutingPageModified { get; set; } // TODO: Internal - Remove from data contract
public bool IsServicePageModified { get; set; } // TODO: Internal - Remove from data contract
public bool IsContentAndContainerPageModified { get; set; } // Rmove from data contract
public string FamilyRange { get; set; } // TODO: Is this being used?
public string Office { get; set; }
public string ActivityType { get; set; }
public string ActivitySubject { get; set; }
public string ActivityNote { get; set; }
public ContactEntity PrimaryOriginTransferee { get; set; }
public ContactEntity PrimaryDestinationTransferee { get; set; }
public CustomerEntity Customer { get; set; }
public AddressEntity OriginAddress { get; set; }
public AddressEntity DestinationAddress { get; set; }
public OrderEntity Order { get; set; }
public ShipmentEntity Shipment { get; set; }
public string CreatedBy { get; set; }
public DateTime CreatedDate { get; set; }
public string ModifiedBy { get; set; }
public DateTime ModifiedDate { get; set; }
public string SourceSystemId { get; set; }
public string SourceSystemName { get; set; }
public string Version { get; set; }
public string PortalId { get; set; }
public MoveEntity()
{
PrimaryOriginTransferee = new ContactEntity
{
ContactTypeId = ContactEntity.ContactType.PrimaryOriginationTransferee
};
PrimaryDestinationTransferee = new ContactEntity
{
ContactTypeId = ContactEntity.ContactType.PrimaryDestinationTransferee
};
OriginAddress = new AddressEntity
{
AddressTypeId = AddressEntity.AddressType.Origination
};
DestinationAddress = new AddressEntity
{
AddressTypeId = AddressEntity.AddressType.Destination
};
Order = new OrderEntity();
Customer = new CustomerEntity();
Shipment = new ShipmentEntity();
}
public bool HasShipment()
{
if (Shipment.ShipmentId > 0)
{
return true;
}
return false;
}
}
Свойства в каждом классе почти совпадают отлично по имени, но их типы отличаются. Поэтому я попытался выполнить пользовательское отображение с помощью выражения "MapFrom". Однако AutoMapper, кажется, не может позволить мне указывать от одного типа объекта до другого без, жалуются.
Я также попытался отобразить от свойства к свойству без удачи. Это выглядело примерно так:
.ForMember(dest => dest.PrimaryOriginTransferee.Email, opt => opt.MapFrom(src => src.PrimaryOriginTransferee.Email))
Однако при попытке этого, я получаю следующий exeception:
должен решить участнику верхнего уровня. Название параметра: lambdaExpression.
Я находил документацию доступной для AutoMapper трудный следовать. Кто-то может указать на меня в правильном направлении относительно того, как использовать эту утилиту правильно?
Заранее спасибо за любую справку!
Adam
Спасибо, ребята - я в итоге сделал по существу комбинацию ваших советов. Я открыл два дескриптора файлов - второй $ hfh с заголовком = > 0, чтобы я мог напечатать этикетки заголовков в правильном порядке, как это:
my $fh = Tie::Handle::CSV->new($file, header => 1);
my $hfh = Tie::Handle::CSV->new($file, header=>0);
my $line = <$hfh>;
my $header;
foreach(@{$line}) {
$header .= "\"$_\",";
}
print "$header\n";
Еще раз спасибо за вашу помощь!
-121--4244819-Linux имеет strace/ltrace (см. это сообщение о strace). Но они на самом деле не эквивалентны DTrace, они просто охватывают небольшую часть того, что DTrace может сделать (на самом деле, DTrace значительно превосходит все предложения Linux).
-121--1193220-Я наконец-то получил это, чтобы работать самостоятельно. Код, который я в итоге использовал, опубликован ниже. Создание карты объектов в правильном порядке оказалось важным. Я многому научился, сражаясь через эту штуку.
Я организовал свои сопоставления в профиль, в который я не попаду здесь, достаточно сказать, что если вы можете использовать мой пример вне класса, наследующего от класса AutoMapper Profile, вы хотите использовать Mapper.CreateMap вместо просто Создать карту.
private void CreateMaps()
{
CreateMap<ContactEntity, TransfereeEntityDto>();
//ContactEntity Mapping
CreateMap<ContactEntity, TransfereeEntityDto>();
//CustomerEntity Mapping
CreateMap<CustomerEntity, CustomerEntityDto>();
//AddressEntity Mapping
CreateMap<AddressEntity, AddressEntityDto>();
//ServiceEntity Mapping
CreateMap<ServiceEntity, ServiceEntityDto>()
.ForMember(dto => dto.ServiceTypeCode, opt => opt.MapFrom(source => source.TypeCode))
.ForMember(dto => dto.ServiceDescriptionCode, opt => opt.MapFrom(source => source.DescriptionCode))
.ForMember(dest => dest.SourceSystemName, opt => opt.ResolveUsing<SourceSystemNameResolver>().FromMember(entity => entity.SourceSystemName));
//VehicleEntity Mapping
CreateMap<VehicleEntity, VehicleEntityDto>()
.ForMember(dest => dest.SourceSystemName, opt => opt.ResolveUsing<SourceSystemNameResolver>().FromMember(entity => entity.SourceSystemName))
.ForMember(dto => dto.PortalId, option => option.Ignore()); //TODO: Should PortalID be mapped to anything? It is not in the entity.
//ContentEntity Mapping
CreateMap<ContentEntity, ContentEntityDto>()
.ForMember(dest => dest.SourceSystemName, opt => opt.ResolveUsing<SourceSystemNameResolver>().FromMember(entity => entity.SourceSystemName));
//OrderForwardingEntity Mapping
CreateMap<OrderForwardingEntity, OrderForwardingEntityDto>();
//ContainerEntity Mapping
CreateMap<ContainerEntity, ContainerEntityDto>()
.ForMember(dest => dest.SourceSystemName, opt => opt.ResolveUsing<SourceSystemNameResolver>().FromMember(entity => entity.SourceSystemName));
//ShipmentForwardingEntity Mapping
CreateMap<ShipmentForwardingEntity, ShipmentForwardingEntityDto>();
//ShipmentRouting Mapping
CreateMap<ShipmentRoutingEntity, ShipmentRoutingEntityDto>();
//ShipmentEntity Mapping
CreateMap<ShipmentEntity, ShipmentEntityDto>()
.ForMember(dest => dest.SourceSystemName, opt => opt.ResolveUsing<SourceSystemNameResolver>().FromMember(entity => entity.SourceSystemName))
.ForMember(dto => dto.Services, option => option.MapFrom(source => source.ServiceEntities));
//Forwarder mapping
CreateMap<ContactEntity, ForwarderEntityDto>();
//TODO: This property doesn't have any properties in the data contract
//OrderEntity Mapping
CreateMap<OrderEntity, OrderEntityDto>()
.ForMember(dest => dest.SourceSystemName,
opt => opt.ResolveUsing<SourceSystemNameResolver>().FromMember(entity => entity.SourceSystemName));
//.ForMember(dto => dto.Forwarder, option => option.MapFrom(entity=>entity.Forwarder)
//MoveEntityMapping
CreateMap<MoveEntity, MoveEntityDto>()
.ForMember(dto => dto.SourceSystemName, opt => opt.ResolveUsing<SourceSystemNameResolver>().FromMember(entity => entity.SourceSystemName));
}
Вам необходимо добавить картографические конфигурации для типов свойств, где тип целевого свойства отличается от типа свойства назначения.
Mapper.CreateMap<ContactEntity, TransfereeEntity>();