2017-01-30 8 views
0

最初に、私の上記の質問が混乱している場合、私はAutomapperを初めて使用していて、これは私の考えを馬鹿馬鹿しい音質の問題に結びつけようとしているかもしれません。Automapperを使用して派生クラスを基本クラスのプロパティにマップする方法

基本クラスを継承するいくつかのクラスを作成しました。これは、以下に示すものよりも多くのエンティティの基本クラスを再利用することを意図しているからです。簡単にするために、私はプロパティのクラスを無効にするつもりです。

私の問題は、PersonBusinessプロパティのマッピングです。 EF 6でSQLからデータをロードすると、EmployeeオブジェクトとBranchオブジェクトとしてPersonBusinessオブジェクトのPersonプロパティとBusinessプロパティがロードされるのがわかります。なぜなら、これがクエリのために引き戻されているからですが、 Employee ObjectおよびBranchオブジェクトをPersonBusinessオブジェクトからPersonBusinessDtoオブジェクトにロードし、それらをPersonクラスおよびBusinessクラスタイプとしてロードします。明らかに、派生クラスに含まれるすべてのプロパティを残しています。

PersonBusinessオブジェクトにロードされたデータが、PersonおよびBusinessプロパティが派生型EmployeeおよびBranchでロードできるオブジェクト参照変数であることを考えると、AutomapperはEmployeeオブジェクトとBranchオブジェクトを認識し、マップそれらを基本タイプのPersonとBusinessに変換します。

これは、データベースからロードされたデータの例である:

This is an example of the data loaded from the database

これはPersonBusinessDtoにマッピングされたデータの例である:

以下

And this is an example of the data mapped to the PersonBusinessDto

あります基本クラス構造と私がエンティティをPersonBusinessマッピング以外のすべてでうまく動作するDTOにマップするために使用したマッピング。

Entity.cs

public abstract class Entity : IEntity 
{ 

} 

EntityDto.cs

public abstract class EntityDto : IEntityDto 
{ 

} 

Person.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; }; 
} 

Employee.cs

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; }; 
} 

支店。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)); 
     } 
    } 

答えて

0

は、それらがPersonBusinessクラス内の実際の型は、それぞれ以来、EmployeeBranchPersonBusinessにupcastedされていることです。その後、AutoMapperはマッピングを行うとき、それはPersonBusiness種類を見て、そのための構成が決まるようPersonDtoBusinessDtoにそれらをマッピングします。

アップキャストされても、オブジェクトはまだEmployeeBranchのインスタンスです。あなたはEmployeeBranchに戻って唱えられます。しかし、AutoMapperはPersonDtoBusinessDtoの実際のインスタンスを作成しているので、あなたはEmployeDtoBranchDtoにそれらをキャストませんでき

実際に正しいプロパティタイプのクラスを持っていないと、マッピング中に正しいタイプにキャストする必要があります。これは本当に苦痛になります。主に、あなたはMapFromは、ラムダは一種類のみを返すことができますので、様々な派生型を返すことができるようにするつもりされていないことを問題に実行するつもりです。

AutoMapperは事の仕事のこの種を作成する方法についていくつかのguidanceを提供します。ただし、インスタンスを直接扱うのではなく、それらのインスタンスのプロパティを直接扱うことに気づくでしょう。私は実際に、あなたは、単にPersonBusinessからPersonBusinessDtoにマッピングし、その後、明示的にすなわち、AutoMapperドキュメントの詳細をメソッドを使用してプロパティを介して

をマッピングし、これらのプロパティをマッピング無視するよりも、他の操作を行う必要がある何をするかどうかはわかりません

personBusinessDto.Person = Mapper.Map(personBusiness.Person, personBusiness.Person.GetType(), typeof(PersonDto)); 
は、私が言ったように:本当の痛み。

関連する問題