我知道有很多关于automapper的问题。
我的问题是相关对象没有被Automapper映射,但是foreignId没有映射。
public class Location
{
public int Id { get; set; }
public string Name{ get; set; }
[ForeignKey("Company")]
public int? CompanyId { get; set; }
public Company Company { get; set; }
}
Dto对象:
public class LocationDto
{
public int Id{ get; set; }
public string Name{ get; set; }
public int? CompanyId { get; set; } // this is 1 - which the Company.Id
public CompanyDto Company { get; set; } // this is NULL
}
这里是映射配置:
var configurator= new MapperConfigurationExpression();
configurator.CreateMap<LocationDto, Location>()
.ForMember(d => d.Company, opt => opt.MapFrom(s => s.Company));
configurator.CreateMap<Company, CompanyDto>();
configurator.CreateMap<CompanyDto, Company>();
Mapper.Initialize(configurator);
如果我知道的话,我是以正确的方式做到的,因为我在很多帖子和教程中都看到了这个解决方案。
这里是被调用的映射命令:
Task.FromResult(Mapper.Map<TSource>(DataLayer.Get<TDest>(id)));
我不知道为什么LocationDto.Company
总是为NULL(但LocationDto.CompanyId
道具总是有值)。 你知道为什么这是空的吗?
我也试过没有ForMember,或者使用Member.Sourclist
configurator.CreateMap<LocationDto, Location>();
configurator.CreateMap<LocationDto, Location>(Member.SourceList);
但没有任何帮助。
更新:公司
public class CompanyDto
{
public int Id{ get; set; }
public string Title{ get; set; }
public string Description { get; set; }
public int? CountryId { get; set; }
//public CountryDto Country { get; set; }
public int? CountyId{ get; set; }
//public County County{ get; set; }
public bool Active { get; set; }
}
这里是服务器部分:
public class Company
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id{ get; set; }
public string Title{ get; set; }
public string Description { get; set; }
[ForeignKey("Country")]
public int? CountryId { get; set; }
public Country Country { get; set; }
[ForeignKey("County")]
public int? CountyId{ get; set; }
public County County{ get; set; }
public bool Active { get; set; }
public virtual ICollection<Haders> Haders { get; set; }
public virtual ICollection<Parts> Parts{ get; set; }
public Company()
{
this.Active = true;
}
public Company(string title, string description)
{
this.Title = title;
this.Description = description;
}
}
答案 0 :(得分:0)
我想,你忘了这个:
configurator.CreateMap<CompanyDto, Company>()
你需要添加Comany - &gt; CompanyDto映射到配置。
答案 1 :(得分:0)
您必须使用Include
方法来加载与Eager Loading相关的对象。
您可以使用AutoMapper.EF6来执行此操作。
context.Locations.Where(x => x.Id == 1)
.Include(l => l.Company)
.ProjectToFirst<LocationDto>(Mapper.Configuration);