C# 实例版本为AutoMapper的嵌套映射

C# 实例版本为AutoMapper的嵌套映射,c#,serialization,automapper,C#,Serialization,Automapper,我正在尝试使用AutoMapper的实例版本,在AutoMapper中使用嵌套映射,但它似乎不起作用 以下是我使用的两个模型: public class User { [Key] public string Email { get; set; } public string Hash { get; set; } public string Salt { get; set; } public string Name { get; set; } pu

我正在尝试使用AutoMapper的实例版本,在AutoMapper中使用嵌套映射,但它似乎不起作用

以下是我使用的两个模型:

public class User
{
    [Key]
    public string Email { get; set; }
    public string Hash { get; set; }
    public string Salt { get; set; }
    public string Name { get; set; }

    public virtual ICollection<TaskTime> TaskTimes { get; set; }
    public virtual ICollection<Role> Roles { get; set; }
    public virtual ICollection<HistoricalEstimation> HistoricalEstimations { get; set; }
}

public class TaskTime
{
    public int Id { get; set; }
    public User User { get; set; }
    public Task Task { get; set; }
    public TimeSpan Duration { get; set; }
    public DateTime Date { get; set; }
}

假设您有一个输入错误,并且UserFull应该有一个UserTaskTime的集合,而不是TaskTime的集合,这些快速测试可以工作:

[TestFixture]
public class MappingTests2
{
    [Test]
    public void AutoMapper_Configuration_IsValid()
    {
        UserViewConfiguration.Configure();
        Mapper.AssertConfigurationIsValid();
    }

    [Test]
    public void AutoMapper_MapsAsExpected()
    {
        UserViewConfiguration.Configure();
        Mapper.AssertConfigurationIsValid();

        var user = new User
            {
                Email = "user1@email.com",
                Hash = "1234Hash",
                Name = "user1",
                Salt = "1234Salt",
                TaskTimes =
                    new Collection<TaskTime>
                        {
                            new TaskTime
                                { Date = new DateTime(2012, 11, 01), Duration = new TimeSpan(0, 20, 1), Id = 1 },
                            new TaskTime
                                { Date = new DateTime(2012, 11, 02), Duration = new TimeSpan(0, 20, 2), Id = 2 }
                        }
            };

        foreach (var taskTime in user.TaskTimes)
        {
            taskTime.User = user;
        }

        var userView = Mapper.Map<User, UserFull>(user);

        Assert.That(userView, Is.Not.Null);
        Assert.That(userView.Email, Is.EqualTo("user1@email.com"));
        Assert.That(userView.Name, Is.EqualTo("user1"));
        Assert.That(userView.TaskTimes, Is.Not.Null);
        Assert.That(userView.TaskTimes.Count, Is.EqualTo(2));
        var tt = userView.TaskTimes.FirstOrDefault(x => x.Id == 1);
        Assert.That(tt, Is.Not.Null);
        Assert.That(tt.Id, Is.EqualTo(1));
        Assert.That(tt.Date, Is.EqualTo(new DateTime(2012, 11, 01)));
        Assert.That(tt.Duration, Is.EqualTo(new TimeSpan(0, 20, 1)));
    }
}
[TestFixture]
公共类映射测试2
{
[测试]
public void AutoMapper_配置_IsValid()
{
UserViewConfiguration.Configure();
assertConfigurationsValid();
}
[测试]
public void AutoMapper_MapsAsExpected()
{
UserViewConfiguration.Configure();
assertConfigurationsValid();
var user=新用户
{
电子邮件=”user1@email.com",
Hash=“1234Hash”,
Name=“user1”,
Salt=“1234Salt”,
任务时间=
新收藏
{
新任务时间
{Date=newdatetime(2012,11,01),Duration=newtimespan(0,20,1),Id=1},
新任务时间
{Date=newdatetime(2012,11,02),Duration=newtimespan(0,20,2),Id=2}
}
};
foreach(user.TaskTimes中的var taskTime)
{
taskTime.User=User;
}
var userView=Mapper.Map(用户);
Assert.That(userView,Is.Not.Null);
Assert.That(userView.Email,Is.EqualTo(“user1@email.com"));
Assert.That(userView.Name,Is.EqualTo(“user1”);
Assert.That(userView.TaskTimes,Is.Not.Null);
Assert.That(userView.TaskTimes.Count,Is.EqualTo(2));
var tt=userView.TaskTimes.FirstOrDefault(x=>x.Id==1);
Assert.That(tt,Is.Not.Null);
断言(tt.Id,Is.EqualTo(1));
断言(tt.Date,Is.EqualTo(新日期时间(2012年11月1日));
Assert.That(tt.Duration,Is.EqualTo(新的时间跨度(0,20,1));
}
}
请注意,对于以上内容,我使用静态方法将映射转换回:

public static void Configure()
{
    Mapper.CreateMap<User, UserFull>();
    Mapper.CreateMap<TaskTime, UserTaskTime>();

    Mapper.AssertConfigurationIsValid();
}
publicstaticvoidconfigure()
{
CreateMap();
CreateMap();
assertConfigurationsValid();
}

我会再看一看,如果你真的想成为TaskTimes。

这不是一个打印错误,我只是把用户模型属性复制到VIEW模型类,并没有真的认为我需要将它改为目标类——一个极其愚蠢的错误。谢谢你指出这一点。我不使用静态方法的原因是,访问每个对象会有很多不同的方法,在每种情况下使用不同的映射看起来更干净。
// GET api/Users
public IEnumerable<UserFull> GetUsers()
{
    //var query = SelectUsers(db.Users.ToList());
    return UserViewConfiguration.Engine.Map<IEnumerable<UserFull>>(db.Users);
}
[TestFixture]
public class MappingTests2
{
    [Test]
    public void AutoMapper_Configuration_IsValid()
    {
        UserViewConfiguration.Configure();
        Mapper.AssertConfigurationIsValid();
    }

    [Test]
    public void AutoMapper_MapsAsExpected()
    {
        UserViewConfiguration.Configure();
        Mapper.AssertConfigurationIsValid();

        var user = new User
            {
                Email = "user1@email.com",
                Hash = "1234Hash",
                Name = "user1",
                Salt = "1234Salt",
                TaskTimes =
                    new Collection<TaskTime>
                        {
                            new TaskTime
                                { Date = new DateTime(2012, 11, 01), Duration = new TimeSpan(0, 20, 1), Id = 1 },
                            new TaskTime
                                { Date = new DateTime(2012, 11, 02), Duration = new TimeSpan(0, 20, 2), Id = 2 }
                        }
            };

        foreach (var taskTime in user.TaskTimes)
        {
            taskTime.User = user;
        }

        var userView = Mapper.Map<User, UserFull>(user);

        Assert.That(userView, Is.Not.Null);
        Assert.That(userView.Email, Is.EqualTo("user1@email.com"));
        Assert.That(userView.Name, Is.EqualTo("user1"));
        Assert.That(userView.TaskTimes, Is.Not.Null);
        Assert.That(userView.TaskTimes.Count, Is.EqualTo(2));
        var tt = userView.TaskTimes.FirstOrDefault(x => x.Id == 1);
        Assert.That(tt, Is.Not.Null);
        Assert.That(tt.Id, Is.EqualTo(1));
        Assert.That(tt.Date, Is.EqualTo(new DateTime(2012, 11, 01)));
        Assert.That(tt.Duration, Is.EqualTo(new TimeSpan(0, 20, 1)));
    }
}
public static void Configure()
{
    Mapper.CreateMap<User, UserFull>();
    Mapper.CreateMap<TaskTime, UserTaskTime>();

    Mapper.AssertConfigurationIsValid();
}