【问题标题】:AutoMapper EF with interfaces and nested collection带有接口和嵌套集合的 AutoMapper EF
【发布时间】:2017-04-26 18:36:37
【问题描述】:

这是我的设置,之后出现错误和描述。

接口:

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 配置:

        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 代码:

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

错误:

{"HiThere.DAL.User 上的以下属性无法映射:\n\tUser\n添加自定义映射表达式,忽略,添加自定义解析器,或修改目标类型 HiThere.DAL.User。\n上下文: \n\t从 HiThere.Model.Common.IUser 映射到属性 User 到 HiThere.DAL.User\n引发了 'AutoMapper.AutoMapperConfigurationException' 类型的异常。"}

说明:

我在 ASP.NET WebAPI2 项目中使用 AutoMapper 在 DAL 和模型之间映射数据。由于某种原因,我在使用嵌套对象时无法进行正确的映射。 任何帮助将不胜感激。

【问题讨论】:

  • 不应该所有cfg.CreateMap 都在一个Mapper.Initialize 中吗?也没有从DAL 类到接口的映射。此外,如果 DAL 类实际上实现了这些接口,为什么还需要 AutoMapper?
  • tkanks 移动 cfg.CreateMap o 单个 Mapper.Initializer 修复问题!!!

标签: c# entity-framework asp.net-web-api2 automapper dto


【解决方案1】:

实际上我通过将所有 cfg.CreateMap 添加到单个 Mapper.Inizialize 来修复它。我的错。希望有人会觉得这很有用。

        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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-15
    • 2013-05-13
    • 2020-12-12
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 2020-11-27
    相关资源
    最近更新 更多