簡體   English   中英

EF Core 相關數據為 null with AutoMapper

[英]EF Core related data is null with AutoMapper

在我的應用中,一個案例可以有很多公司。

我的模型:

public class Case
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string Name { get; set; }
    public IList<CaseCompany> CaseCompanies { get; set; }
}

public class CaseInput
{
    public Guid Id { get; set; }
    [Required]
    public string Name { get; set; }
    public IList<CaseCompanyInput> CaseCompanyInputs { get; set; }
}

public class Company
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string Name { get; set; }
}

public class CompanyInput
{
    public Guid Id { get; set; }
    [Required]
    public string Name { get; set; }
}

public class CaseCompany
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public Guid CaseId { get; set; }
    public Guid CompanyId { get; set; }
    public class Case Case { get; set; }
    public class Company Company { get; set; }
}

public class CaseCompanyInput
{
    public Guid Id { get; set; }
    public Guid CaseId { get; set; }
    public Guid CompanyId { get; set; }
    public class CaseInput CaseInput { get; set; }
    public class CompanyInput CompanyInput { get; set; }
}

AutoMapperProfiles.cs:

// In Startup.cs: services.AddAutoMapper(typeof(AutoMapperProfiles));

public class AutoMapperProfiles : Profile
{
    public AutoMapperProfiles()
    {
        CreateMap<Case, CaseInput>().ReverseMap();
        CreateMap<CaseCompany, CaseCompanyInput>().ReverseMap();
        CreateMap<Company, CompanyInput>().ReverseMap();
    }
}

編輯案例.cs:

private readonly DBContext _dbContext;
private readonly IMapper _mapper;

[BindProperty]
public CaseInput CaseInput { get; set; }

public EditCase(DBContext dbContext, IMapper mapper)
{
    _dbContext = dbContext;
    _mapper = mapper;
}

public async Task<IActionResult> OnGetAsync(Guid caseId)
{
    var getCase = await _dbContext.Cases.Include(x => x.CaseCompanies).ThenInclude(x => x.Company).FirstOrDefaultAsync(x => x.Id == caseId);
    CaseInput = _mapper.Map<CaseInput>(getCase);

    Console.WriteLine(getCase.CaseCompanies[0].Company.Name) // gets the company name
    Console.WriteLine(CaseInput.CaseCompanyInputs[0].CompanyInput.Name) // CaseInput.Name is not null but CaseCompanyInputs is null

    return Page();

}

我也試過:

CaseInput = await _dbContext.Cases.ProjectTo<CaseInput>(_mapper.ConfigurationProvider).FirstOrDefaultAsync(x => x.Id == caseId);

CaseInput = await _dbContext.Cases.Include(x => x.CaseCompanies).ThenInclude(x => x.Company).ProjectTo<CaseInput>(_mapper.ConfigurationProvider).FirstOrDefaultAsync(x => x.Id == caseId);

結果相同: CaseCompanyInputs為 null。

我最好的猜測是輸入模型的關系有錯誤,但我就是看不到。 我相信我已經遵循命名約定來使關系正確。

任何幫助,將不勝感激。

要使自動映射起作用,您必須將您的目標屬性名稱重命名為與源屬性名稱相同

public class CaseInput
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    //public IList<CaseCompanyInput> CaseCompanyInputs { get; set; }
    public IList<CaseCompanyInput> CaseCompanies { get; set; }
}

public class CaseCompanyInput
{
    public Guid Id { get; set; }
    public Guid CaseId { get; set; }
    public Guid CompanyId { get; set; }
    //public CaseInput CaseInput { get; set; }
    public CaseInput Case { get; set; }
    //public CompanyInput CompanyInput { get; set; }
    public CompanyInput Company { get; set; }
}

如果您不想更改屬性名稱,請將您的配置更改為以下內容。

CreateMap<Case, CaseInput>()
    .ForMember(dest => dest.CaseCompanyInputs, opt => opt.MapFrom(src => src.CaseCompanies));

CreateMap<CaseCompany, CaseCompanyInput>()
    .ForMember(dest => dest.CaseInput, opt => opt.MapFrom(src => src.Case))
    .ForMember(dest => dest.CompanyInput, opt => opt.MapFrom(src => src.Company));

暫無
暫無

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

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