Drazen Kozic
Drazen Kozic

Reputation: 21

AutoMapper EF with interfaces and nested collection

Here is my settings, after them goes error and description.

Interfaces:

public interface IUser
{
    int Id { get; set; }
    string Firstname { get; set; }
    string Lastname { get; set; }
    string Email { get; set; }
    string Fullname { get; }
}

public interface IPost
{
    int Id { get; set; }

    String Description { get; set; }

    DateTime CreatedDate { get; set; }

    int? UserId { get; set; }

    IUser User { get; set; }

    ICollection<IComment> Comments { get; set; }
}

public interface IComment
{
    int Id { get; set; }
    string Description { get; set; }
    DateTime CreatedDate { get; set; }
    int? PostId { get; set; }
    int? UserId { get; set; }
    IUser User { get; set; }
}

AutoMapper config:

        Mapper.Initialize(cfg => cfg.CreateMap<IUser, DAL.User>());
        Mapper.Initialize(cfg => cfg.CreateMap<IComment, DAL.Comment>());
        Mapper.Initialize(cfg => cfg.CreateMap<IPost, DAL.Post>()
            .ForMember(d => d.User, m => m.MapFrom(s => s.User))
            .ForMember(d => d.UserId, m => m.MapFrom(s => s.User.Id))
            .ForMember(d => d.Comments, m => m.MapFrom(s => s.Comments))
        );

        Mapper.AssertConfigurationIsValid();

EF code:

    public IEnumerable<IPost> GetPosts()
    {
        IQueryable<DAL.Post> query = dbSet.Posts.Include("Comments");
        var result = Mapper.Map<IEnumerable<IPost>>(query);
        return result;
    }

Error:

{"The following property on HiThere.DAL.User cannot be mapped: \n\tUser \nAdd a custom mapping expression, ignore, add a custom resolver, or modify the destination type HiThere.DAL.User.\nContext:\n\tMapping to property User from HiThere.Model.Common.IUser to HiThere.DAL.User\nException of type 'AutoMapper.AutoMapperConfigurationException' was thrown."}

Description:

I'm using AutoMapper inside ASP.NET WebAPI2 project to map data between DAL and Models. For some reason I cannot make proper mapping when using nested objects. Any help will be appreciated.

Upvotes: 1

Views: 683

Answers (1)

Drazen Kozic
Drazen Kozic

Reputation: 21

Actually I fix it by adding all cfg.CreateMap to single Mapper.Inizialize. My mistake. Hopefully someone will find this usefull.

        Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<DAL.Post, IPost>()
                    .ForMember(d => d.User, m => m.MapFrom(s => s.User))
                    .ForMember(d => d.UserId, m => m.MapFrom(s => s.User.Id))
                    .ForMember(d => d.Comments, m => m.MapFrom(s => s.Comments))
                ;
                cfg.CreateMap<IUser, DAL.User>().ReverseMap();
                cfg.CreateMap<IComment, DAL.Comment>().ReverseMap();
            } 
        );

        Mapper.AssertConfigurationIsValid();

Upvotes: 1

Related Questions