可以将模型映射到viewModel,但viewModel到model将不起作用

时间:2013-06-21 23:11:04

标签: entity-framework asp.net-mvc-4 automapper

我使用Automapper将我的域模型映射到我的viewModel,这非常有用。 Atm我只是原型设计和改变模型很多,所以此时我的viewModel几乎是我的模型的精确副本,我的viewModel从域中引用其复杂类型的类(所以我只需保留根类我的viewModel与我的域模型同步。)

尽管从域模型到viewModel的映射效果很好,但将viewModel映射回域模型并不能很好地工作。直接在viewModel中的值会映射,但复杂类型的列不会映射。我该如何解决这个问题?

这是我模型的简单表示:

public class model
{
    public int someValue { get; set; }
    public virtual ICollection<ComplexType> aList { get; set; }
}
public class viewModel
{
    public int someValue { get; set; }
    public virtual ICollection<ComplexType> aList { get; set; }
}
public class ComplexType
{
    public int someOtherValue { get; set; }
}

在这种情况下,模型和viewModel都引用 ComplexType 的相同文件,因此这些文件不能有所不同。

1 个答案:

答案 0 :(得分:0)

从ViewModel映射到域模型时,您是否使用了ReverseMap?

public class CustomProfile : Profile
{
    protected override void Configure()
    {
        // Mapper.CreateMap<Model, ViewModel>();
        // Mapper.CreateMap<ViewModel, Model>();
        Mapper.CreateMap<Model, ViewModel>().ReverseMap();
    }
}

这非常合理,并且可以毫无问题地映射所有内容。

[TestInitialize]
public void Initialize()
{
    Mapper.Initialize(conf => conf.AddProfile(new CustomProfile()));
}

[TestMethod]
public void AssertConfiguration()
{
    Mapper.AssertConfigurationIsValid();
}

[TestMethod]
public void Test()
{
    var model = new Model()
        {
            ComplexTypes = new Collection<ComplexType>() { new ComplexType() { SomeOtherValue = 1 }, new ComplexType() { SomeOtherValue = 4 } },
            SomeValue = 3
        };

    var viewModel = Mapper.Map<ViewModel>(model);

    Assert.AreEqual(model.SomeValue, viewModel.SomeValue);
    Assert.AreEqual(model.ComplexTypes.Count, viewModel.ComplexTypes.Count);
    Assert.AreEqual(model.ComplexTypes.ElementAt(0), viewModel.ComplexTypes.ElementAt(0));
    Assert.AreEqual(model.ComplexTypes.ElementAt(1), viewModel.ComplexTypes.ElementAt(1));

    model = Mapper.Map<Model>(viewModel);

    Assert.AreEqual(viewModel.SomeValue, model.SomeValue);
    Assert.AreEqual(viewModel.ComplexTypes.Count, model.ComplexTypes.Count);
    Assert.AreEqual(viewModel.ComplexTypes.ElementAt(0), model.ComplexTypes.ElementAt(0));
    Assert.AreEqual(viewModel.ComplexTypes.ElementAt(1), model.ComplexTypes.ElementAt(1));
}