簡體   English   中英

如何使用Automapper將派生類映射到基類屬性

[英]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的數據的示例:

這是映射到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));
        }
    }

這里發生的事情是EmployeeBranch分別轉換為PersonBusiness ,因為它們是PersonBusiness類中的實際類型。 然后,當AutoMapper進行映射時,它會看到PersonBusiness類型,並根據配置要求將它們映射到PersonDtoBusinessDto

這些對象仍然是EmployeeBranch實例,即使它們已被廢棄。 您可以退回給EmployeeBranch 但是,AutoMapper正在創建PersonDtoBusinessDto實際實例,因此您不能將它們EmployeDto BranchDtoEmployeDtoBranchDto

缺少具有實際正確屬性類型的類,您必須在映射期間將它們強制轉換回正確的類型,這將是一個真正的痛苦。 原則上,您會遇到MapFrom無法返回各種派生類型的問題,因為lambda只能返回一種類型。

AutoMapper為如何使這種事情工作提供了一些指導 但是,您會注意到它直接處理實例,而不處理那些實例的屬性。 我不知道如何實際,做你需要做的,除了簡單地忽略從映射時映射這些屬性是什么PersonBusinessPersonBusinessDto ,然后明確地映射在使用該方法的AutoMapper文檔細節,即屬性

personBusinessDto.Person = Mapper.Map(personBusiness.Person, personBusiness.Person.GetType(), typeof(PersonDto));

就像我說的:真正的痛苦。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM