规格: .NET 4.5.1 - MVC 5.2.2 - EF 6.0 - AutoMapper 3.2.1
我第一次遇到代理对象错误但是能够通过执行以下操作来解决它:AutoMapper 3.1.1 and Entity Framework 6.1 Proxy objects
我修复了该错误后,立即收到以下错误消息:
出于某种原因,它表示从Pages到PagesViewModel的地图并不存在,即使它确实存在。这是我的代码:
在 Global.asax.cs :
中protected void Application_Start()
{
ConfigureAutomapper.Configure();
....
在 AutoMapper.cs(更新)
中public static class ConfigureAutomapper
{
public static void Configure()
{
ConfigurePublications();
ConfigureBlog();
ConfigureBasic();
ConfigureLists();
}
public static void ConfigurePublications()
{
Mapper.Initialize(x =>
{
x.AddProfile<PublicationsMappings>();
});
}
public static void ConfigureBlog()
{
Mapper.Initialize(x =>
{
x.AddProfile<BlogMappings>();
});
}
public static void ConfigureBasic()
{
Mapper.Initialize(x =>
{
x.AddProfile<BasicMappings>();
});
}
public static void ConfigureLists()
{
Mapper.Initialize(x =>
{
x.AddProfile<ListMappings>();
});
}
}
...
public class BasicMappings : Profile
{
public override string ProfileName
{
get
{
return "BasicMappings";
}
}
protected override void Configure()
{
Mapper.CreateMap<Pages, PagesViewModel>();
Mapper.CreateMap<PagesViewModel, Pages>();
...
我已经跟踪了它并且它进入并创建了地图。当它使用转换时,它不起作用。
对于model和viewModel,所有变量名都是相同的。我只添加了数据注释和一些清理类set { pageDescription = value.StringSanitizer(); }
在声明链接的对象/表时会出现差异:
型号:
public virtual PageType PageTypes { get; set; }
public virtual SiteMap SiteMap { get; set; }
public virtual ICollection<Rows> Row { get; set; }
public virtual Track Tracks { get; set; }
我的 ViewModel:
public PageTypeViewModel PageTypes { get; set; }
public SiteMapViewModel SiteMap { get; set; }
public ICollection<RowsViewModel> Row { get; set; }
public TrackViewModel Tracks { get; set; }
连接到这些模型的viewModels。所有这些都映射到AutoMapper.cs
更新 我已经在项目中进行了单元测试:
[TestMethod]
public void AutoMapper_Basic_Configuration_IsValid()
{
//Arrange
//Act
ConfigureAutomapper.ConfigureBasic();
//Assert
Mapper.AssertConfigurationIsValid();
}
它通过了所有测试,没有映射错误。
有人能就这个问题给我一些见解吗?如果您需要更多信息,请与我们联系。谢谢!
答案 0 :(得分:7)
而不是Mapper.CreateMap<Pages, PagesViewModel>();
,请使用CreateMap<Pages, PagesViewModel>();
。
protected override void Configure()
{
CreateMap<Pages, PagesViewModel>();
CreateMap<PagesViewModel, Pages>();
...
在个人资料中,您需要引用Mapper
的{{1}}或this.CreateMap
的实例。
<强>更新强> 更新我的答案,以便未来的读者不必通过评论来解决问题。
问题在于多次调用CreateMap
。每个新调用都将清除先前的初始化。解决方法是进行一次初始化调用并在其中添加所有配置文件。
答案 1 :(得分:1)
可能配置错误。
您应该添加以下单元测试
[Test]
public void AreMappingsValid()
{
ConfigureAutomapper.Configure();
AutoMapper.Mapper.AssertConfigurationIsValid();
}