[英]How to map a derived class to a base class property with Automapper
首先,如果我的上述問題令人困惑,那么我既不熟悉Automapper,也不太了解行話,很少問這樣的問題,所以我可能想將自己的想法表達成一個荒謬的聽起來的問題。
我創建了一些從基類繼承的類,因為我打算將基類用於比下面所示更多的實體。 為了簡單起見,我將使類保持屬性不變。
我的問題是與PersonBusiness屬性的映射有關。 當我使用EF 6從SQL加載數據時,我看到它將PersonBusiness對象的Person和Business屬性加載為Employee對象和Branch對象,因為這是我要為查詢拉回的內容,但是當我嘗試映射Employee對象和Branch對象(從PersonBusiness對象到PersonBusinessDto對象)將它們作為Person和Business類類型加載; 顯然會忽略派生類中包含的所有屬性。
很明顯,考慮到加載到PersonBusiness對象中的數據,Person和Business屬性是可以使用派生類型Employee和Branch加載的對象引用變量,但是由於某些原因,Automapper會看到Employee和Branch對象並將它們僅映射到基礎人員和業務類型。
這是從數據庫加載的數據的示例:
這是映射到PersonBusinessDto的數據的示例:
以下是基本的類結構和我用來將實體映射到DTO的映射,這些映射對於除PersonBusiness映射之外的所有內容都適用。
Entity.cs
public abstract class Entity : IEntity
{
}
EntityDto.cs
public abstract class EntityDto : IEntityDto
{
}
人.cs
public abstract class Person : Entity
{
public List<PersonBusiness> PersonBusinesses { get; set; };
}
PersonDto.cs
public abstract class PersonDto : EntityDto
{
public List<PersonBusinessDto> PersonBusinesses { get; set; };
}
員工
public class Employee : Person
{
}
EmployeeDto.cs
public class EmployeeDto : PersonDto
{
}
Business.cs
public abstract class Business : Entity
{
public List<PersonBusiness> PersonBusinesses { get; set; };
}
BusinessDto.cs
public abstract class BusinessDto : EntityDto
{
public List<PersonBusinessDto> PersonBusinesses { get; set; };
}
Branch.cs
public class Branch : Business
{
}
BranchDto.cs
public class BranchDto : BusinessDto
{
}
PersonBusiness.cs
public class PersonBusiness
{
public int PersonId { get; set; }
public int BusinessId { get; set; }
public Enums.RoleType RoleType { get; set; }
public Person Person { get; set; }
public Business Business { get; set; }
}
PersonBusinessDto.cs
public class PersonBusinessDto
{
public int PersonId { get; set; }
public int BusinessId { get; set; }
public Enums.RoleType RoleType { get; set; }
public PersonDto Person { get; set; }
public BusinessDto Business { get; set; }
}
AutoMapperConfig.cs
public class ProfileMapping
: Profile
{
private readonly IMapperConfiguration _mappingConfiguration;
public ProfileMapping(IMapperConfiguration config)
{
_mappingConfiguration = config;
}
protected override void Configure()
{
_mappingConfiguration.AllowNullDestinationValues = true;
_mappingConfiguration
.CreateMap<Person, PersonDto>()
.ForMember(dto => dto.PersonBusinesses, opt => opt.MapFrom(src => src.PresonBusinesses));
_mappingConfiguration
.CreateMap<Employee, EmployeeDto>()
_mappingConfiguration
.CreateMap<Business, BusinessDto>()
.ForMember(dto => dto.PersonBusinesses, opt => opt.MapFrom(src => src.PresonBusinesses));
_mappingConfiguration
.CreateMap<Branch, BranchDto>();
_mappingConfiguration
.CreateMap<PersonBusiness, PersonBusinessDto>()
.ForMember(dto => dto.Business, opt => opt.MapFrom(src => src.Business))
.ForMember(dto => dto.Person, opt => opt.MapFrom(src => src.Person));
}
}
這里發生的事情是Employee
和Branch
分別轉換為Person
和Business
,因為它們是PersonBusiness
類中的實際類型。 然后,當AutoMapper進行映射時,它會看到Person
和Business
類型,並根據配置要求將它們映射到PersonDto
和BusinessDto
。
這些對象仍然是Employee
和Branch
實例,即使它們已被廢棄。 您可以退回給Employee
和Branch
。 但是,AutoMapper正在創建PersonDto
和BusinessDto
實際實例,因此您不能將它們EmployeDto
BranchDto
為EmployeDto
和BranchDto
。
缺少具有實際正確屬性類型的類,您必須在映射期間將它們強制轉換回正確的類型,這將是一個真正的痛苦。 原則上,您會遇到MapFrom
無法返回各種派生類型的問題,因為lambda只能返回一種類型。
AutoMapper為如何使這種事情工作提供了一些指導 。 但是,您會注意到它直接處理實例,而不處理那些實例的屬性。 我不知道如何實際,做你需要做的,除了簡單地忽略從映射時映射這些屬性是什么PersonBusiness
到PersonBusinessDto
,然后明確地映射在使用該方法的AutoMapper文檔細節,即屬性
personBusinessDto.Person = Mapper.Map(personBusiness.Person, personBusiness.Person.GetType(), typeof(PersonDto));
就像我說的:真正的痛苦。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.