簡體   English   中英

Map 如何使用 AutoMapper EF Core 將多個相關實體連接到一個 DTO Object

[英]How Map Multiple related Entities to one DTO Object using AutoMapper EF Core

I have three related Entities in my blazor application Opportunity , AppUser and AssignedOpportunity , What I want to achieve is to map Opportunity and AppUser to a DTO Object ReturnAssignedOpportunityDTO which has similar fields as the entities, using AutoMapper , but am not sure how to do that , 下面是實體

 public partial class AssignedOpportunity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    [ForeignKey("OpportunityID")]
    public string OpportunityID { get; set; }
    public string Status { get; set; }
    public Opportunity opportunity { get; set; }


    [ForeignKey("UserID")]
    public string UserID { get; set; }
    public AppUser User { get; set; }
}

機會

 public partial class Opportunity
{
    public Opportunity()
    {           
        AssignedOpportunities= new HashSet<AssignedOpportunity>();
    }
    [Key]
    public string ID { get; set; }
    public string OpportunityName { get; set; }
    public string Description { get; set; }
    public string CreatedBy { get; set; }
    public DateTime DateCreated { get; set; }
    public double EstimatedValue { get; set; }
    public string EmployeeNeed { get; set; }
    public double RealValue { get; set; }
    public string Location { get; set; }
    public string ReasonStatus { get; set; }
    public string Status { get; set; }
     public virtual ICollection<AssignedOpportunity> AssignedOpportunities { get; set; }
}

AppUser Class

 public partial class AppUser : IdentityUser
{
    public AppUser()
    {
        AssignedOpportunities = new HashSet<AssignedOpportunity>();
    }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public string Gender { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string LGA { get; set; }
    public string State { get; set; }
    public virtual ICollection<AssignedOpportunity> AssignedOpportunities { get; set; }

}

這是我想要 map 的 DTO Object。

 public class ReturnOpportunitiesDTO
{
    public int ID { get; set; }
    public string OpportunityID { get; set; }
    public string OpportunityName { get; set; }
    public double EstimatedValue { get; set; }
    public string EmployeeNeed { get; set; }
    public double RealValue { get; set; }
    public string Location { get; set; }
    public string UserID { get; set; }
    public string UserFullName { get; set; }      
    public string Status { get; set; }
}

這是我獲取記錄的查詢

 var result = await _context.AssignedOpportunities.Include(o => o.opportunity).
                ThenInclude(a => a.User).
                Where(a=>a.UserID==UserID.ToString()).ToListAsync();
            return result;

這就是我通常設置 Map 配置文件的方式

 public AssignArtisanProfile()
    {
        CreateMap<AssignedOpportunity, ReturnOpportunities>();
    }

但是由於我想 map 多個實體,我如何包含其他實體

您的方案只是展平復雜 object 的另一個示例。 您在子對象中有屬性,您希望將其帶到底層,同時仍利用 AutoMapper 映射功能。 如果只有在從分配的機會映射到 DTO 時,您可以重用來自應用程序用戶和機會的其他映射......好吧,有一個名為IncludeMembers()的方法(請參閱文檔)正是針對這種情況而存在的。 它允許您重用現有映射中子類型的配置:

config.CreateMap<AssignedOpportunity, ReturnOpportunitiesDTO>()
    .IncludeMembers(source => source.opportunity, source => source.User);
config.CreateMap<Opportunity, ReturnOpportunitiesDTO>();
config.CreateMap<AppUser, ReturnOpportunitiesDTO>()
    .ForMember(
        dest => dest.UserFullName,
        options => options.MapFrom(source =>
            string.Join(
                " ",
                source.FirstName,
                source.MiddleName,
                source.LastName)));

用法:

var mappedDtos = mapper.Map<List<ReturnOpportunitiesDTO>>(assignedOpportuniesFromDatabase);

暫無
暫無

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

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