Automapper返回映射实体的“默认”实例

问题描述 投票:0回答:2

我正在尝试让自动播放器为.NET核心工作,而我似乎错过了一些重要的东西。

我的自动设置程序设置如下:

在我的Startup.cs方法的ConfigureServices中,我有以下几行:

services.AddAutoMapper(typeof(Startup), typeof(ApplicationDbContext));

我还有一个名为MappingProfile的类,它类似于:

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<CfGroup, GroupModel>()
            .IgnoreAllUnmapped();
        CreateMap<GroupModel, CfGroup>()
            .IgnoreAllUnmapped();
        ...
    }
}

IgnoreAllUnmapped是由另一个SO问题提出的,它看起来像这样:

    public static IMappingExpression<TSource, TDest> IgnoreAllUnmapped<TSource, TDest>(
        this IMappingExpression<TSource, TDest> expression)
    {
        expression.ForAllMembers(opt => opt.Ignore());
        return expression;
    }

我的CfGroup看起来像这样:

[Table("Groups")]
public class CfGroup
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [StringLength(100)]
    [Required]
    public string Name { get; set; }

    [DataType(DataType.ImageUrl)]
    [StringLength(250)]
    public string ImageUrl { get; set; }

    [Required]
    public int FounderId { get; set; }

    [ForeignKey("FounderId")]
    public virtual CfUser Founder { get; set; }

    [Required]
    public bool IsActive { get; set; }

    [Required]
    public DateTime CreatedTimestampUtc { get; set; }

    [StringLength(3000)]
    public string About { get; set; }

    public virtual ISet<UserGroupMember> Members { get; set; }

    public virtual ISet<UserGroupManager> Managers { get; set; }
}

...而我的GroupModel看起来像这样:

public class GroupModel
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string ImageUrl { get; set; }

    public string About { get; set; }
}

在调用我的web api端点时,我从数据库中获得了CfGroup实体的集合。然后我运行一个这样的命令:

var dtos = entities.Select(_mapper.Map<GroupModel>);

...但我的dtos是“空的”... IOW,实例已创建,但Id值设置为0,所有字符串值都设置为null。这绝对不是entities变量中的内容。

我也尝试过显式转换它:

var dtos = entities.Select(x => _mapper.Map<GroupModel>(x));

并且,假设这是一个IEnumerable问题,尝试用它制作一个List

var dtos = entities.Select(x => _mapper.Map<GroupModel>(x)).ToList();

...但无论如何,DTO仍然是实例化的,但所有属性都设置为默认值。

我究竟做错了什么?

c# entity-framework automapper
2个回答
1
投票

我怀疑这可能是因为你在你的linq表达式中映射。尝试这样的事情:

var dtos = _mapper.Map<IEnumerable<GroupModel>>(entities.ToList());

0
投票

事实证明,IgnoreAllUnmapped不是正确的方法;事实上,没有它,映射似乎工作正常。我拿出了额外的“异常处理”代码,它按照我的意愿工作。我在思考它。

© www.soinside.com 2019 - 2024. All rights reserved.