AutoMapper.dll中出现未处理的“AutoMapper.AutoMapperMappingException”类型异常

时间:2015-05-30 18:14:14

标签: c# automapper-3

我希望了解Automapper的工作原理。在我使用所谓的ViewModels来发送业务需要从一个或多个数据库表中提取的信息之前,我知道了基本的想法。现在我正在开发一个遗留项目,其中使用了Automapper,也许它提供的不仅仅是那个,但是在给定的时刻我想要找不到(能够)将我的Domain对象映射到我的DTO对象(s)或反之亦然,我不确定哪一种是正确的方法,因为我无法做到。

这是我用来测试Automapper的一些基本功能的控制台项目的一个简单示例:

Visual Studio project

DTO_User.cs类用于将数据发送到前端的位置。它看起来像这样:

public class DTO_User
{
    public int ID { get; set; }
    public string Name { get; set; }
}

User.cs是代表实际域数据的类:

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }
}

所以我想做什么。在我的Program.cs中,我有一个静态方法可以创建一些User个主题:

public static List<Model.User> SeedUsers()
{
    List<Model.User> users = new List<Model.User>()
    {
        new Model.User { ID = 1, Name = "Ivan", PhoneNumber = "1235436"},
        new Model.User { ID = 2, Name = "Petkan", PhoneNumber = "00000000"},
        new Model.User { ID = 3, Name = "Dragan", PhoneNumber = "11111111"},
        new Model.User { ID = 4, Name = "Stoyan", PhoneNumber = "224545346"}
    };
    return users;
}

然后在我的Main方法中,我尝试将此模拟数据映射到我的DTO列表:

    static void Main(string[] args)
    {
        Mapper.CreateMap<DTO.DTO_User, Model.User>();

        //Mock user data as if it's taken from database

        List<Model.User> users = new List<Model.User>();
        users.AddRange(SeedUsers());//Simulate call to database

        //Create List of DTO Users
        List<DTO.DTO_User> dtoUsers = new List<DTO.DTO_User>();

        //Now map the database users to our DTO Users
        foreach (var user in users)
        {
            DTO.DTO_User u = Mapper.Map<Model.User, DTO.DTO_User>(user);
            dtoUsers.Add(u);
        }
    }

我在foreah循环中得到了错误:

DTO.DTO_User u = Mapper.Map<Model.User, DTO.DTO_User>(user);

说我有一些无效的论点。显然,我并没有真正理解Automapper是如何实现实际映射的。上面的代码对我来说是最自然的。我知道这是非常基本的,所以实际的解决方案不会太具挑战性,但如果有人向我解释我的逻辑在哪里破解以及工作代码背后的想法,我真的很感激。

1 个答案:

答案 0 :(得分:1)

尝试添加其他映射:

Mapper.CreateMap<Model.User, DTO.DTO_User>();

并将Map调用更改为以下内容:

DTO.DTO_User u = Mapper.Map<DTO.DTO_User>(user);