最初に、私の上記の質問が混乱している場合、私は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に変換します。
これは、データベースからロードされたデータの例である:
これは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));
}
}