修复此错误后:AutoMapper throws Missing Map when Map exists我收到了该错误:

由于当前线程处于堆栈溢出状态,因此无法求值表达式。
这是我最初收到错误的地方(如您所见,它与第一个错误在同一行):



更新:
当我在我的CreateMap<>();声明中添加ignore语句时:

CreateMap<Pages, PagesViewModel>()
            .ForMember(m => m.PageTypes, x => x.Ignore())
            .ForMember(m => m.SiteMap, x => x.Ignore())
            .ForMember(m => m.Row, x => x.Ignore())
            .ForMember(m => m.Tracks, x => x.Ignore());


我收到此消息:System.Reflection.TargetParameterCountException: Parameter count mismatch.因此,我删除了Ignore语句,并且CreateMaps如下:

CreateMap<Pages, PagesViewModel>();

CreateMap<PagesViewModel, Pages>();


该错误执行以下一项操作(所有这三种操作均已发生并且很难重现特定的错误):


第一个是应用程序保持运行状态,
最终超时。
程序“ [5256] iisexpress.exe”已退出,代码为-2147023895(0x800703e9)。
移至代码的另一部分(我的PagesViewModel)


(更新):

private string PagesURL;
[Required]
[Display(Name = "Page URL")]
[DataType(DataType.Url)]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long and no longer than {1} characters.", MinimumLength = 2)]
public string pagesURL
{
    get { return PagesURL; }
    set { PagesURL = HttpUtility.UrlEncode(value); }
}


当这第三个出现时,我会遇到相同的错误:无法计算表达式,因为当前线程处于堆栈溢出状态。

我尝试通过尝试以下操作来分离出代码,以查看在何处以及为什么这样做:

List<Pages> getPages = db.Pages.ToList();
List<Pages> getPagesOrdered = getPages.OrderBy(o => o.pageOrder).ToList();
List<PagesViewModel> convertPages = new List<PagesViewModel>();
foreach (Pages item in getPages)
{
    PagesViewModel pagesViewModel = new PagesViewModel();

    pagesViewModel.pageDescription = item.pageDescription;
    //...loops through all other properties

    convertPages.Add(pagesViewModel);
}


它从数据库上下文中获取所有Pages,对其进行排序,并在它进入for循环时声明PagesViewModel很好,但它声明pagesViewModel变量很好,然后紧接着它,甚至跳到pagesViewModel.pageDescription = item.pageDescription;行,应用程序崩溃了。 The program '[5176] iisexpress.exe' has exited with code 0 (0x0).

我在顶部链接的答案中,MrChief表示这是我的模型之间如何相互连接的原因。例如,PagesViewModel连接到public virtual PageTypeViewModel PageTypes { get; set; },PageTypesViewModel连接回到PagesViewModel public ICollection<PagesViewModel> Page { get; set; }

我的模型要求将它们连接起来,并且在没有自动映射器的情况下也可以正常工作(我试图手动设置每个变量而导致应用程序崩溃的情况除外)。我被困住了,不胜感激。



更新:

经过这里:http://www.symbolsource.org/Public/Wiki/Using我的一位同事能够为我们获取AutoMapper的符号,因此我们可以跟踪该源代码。我们添加了一个跟踪断点,以输出实际导致问题的原因。这是它输出数百次的结果:

从“页面”。“ PageTypes”到“ PagesViewModel”。“ PageTypes”

因此,基夫先生的预言是正确的。现在不知道该如何解决。

这是PageViewModel链接到PageTypes视图模型:public virtual PageTypeViewModel PageTypes { get; set; },然后在PageTypesViewModel中链接到PageViewModel:public ICollection<PagesViewModel> Page { get; set; }

这就是EF6生成我的模型的方式。我首先去做这个模型。

我可能忘了包含一些重要信息,所以请让我知道是否有任何遗漏。预先感谢您的帮助。

最佳答案

虽然我不太确定为什么代理创建会引起问题,但是我知道这有两种解决方法,它们不需要您关闭代理创建/延迟加载(至少不是永久用于全局范围):

选项A:如果要使用projection

// disable proxy creation just for the duration of query

_context.Configuration.ProxyCreationEnabled = false;

// do the query, map, go crazy!

// enable proxy again. or if your context goes out of scope after this call, then you can ignore re-enabling.
_context.Configuration.ProxyCreationEnabled = true;


选项B:如果您不使用投影

var entity = _context.Where(...);  // or whatever query

// detach entity
_context.Entry(entity).State = EntityState.Detached;

// then call Map


现在阅读更新,可能还有第三个选择:

选项C:修正模型


EF不会生成视图模型,因此您应该能够更改它们以删除循环参考。
Ignore应该可以。我想再说一遍关于为什么或在哪里出现该错误的问题。我以前没看过,并且以前已经映射过属性。


如果您可以发布完整的模型,查看模型和与数据库调用相关的代码,这将有所帮助。也许是一个模型,请查看模型以使其简短。

关于c# - 使用AutoMapper和多对一相关实体的类型为'System.StackOverflowException'的未处理异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26066275/

10-11 00:28