C# - Automapper不包含相关对象

时间:2018-03-21 13:28:41

标签: c# entity-framework mapping automapper

我知道有很多关于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;
        }
}

2 个答案:

答案 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);