gpt4 book ai didi

asp.net-mvc - AutoMapper 奇怪的 IQueryable 投影异常

转载 作者:行者123 更新时间:2023-12-01 13:49:45 25 4
gpt4 key购买 nike

要跳过痛苦,请转到下面的编辑


我将 EF 与 AutoMapper IQueryableExtensions 结合使用。

我的两个模型如下:

public class Article
{
public int Key { get; set; }

public DateTimeOffset Created { get; set; }

public int? SemesterKey { get; set; }
public virtual Semester Semester { get; set; }
}

public class Semester
{
public int Key { get; set; }

public string Name { get; set; }

public virtual ICollection<Article> Articles { get; set; }

// Other relationships
public virtual ICollection<Subject> Subjects { get; set; }

public virtual ICollection<AppUser> Users { get; set; }
}

我有以下 DTO:

public class ArticleDto
{
public int Key { get; set; }

public DateTimeOffset Created { get; set; }

// If I remove this (or ignore it), everything works.
public SemesterDto Semester { get; set; }
}

public class SemesterDto
{
public int Key { get; set; }

public string Name { get; set; }
}

配置:

Mapper.CreateMap<Semester, SemesterDto>().MaxDepth(1);
Mapper.CreateMap<Article, ArticleDto>().MaxDepth(1);

查询:

context.Articles.Include(a => a.Semester)
.OrderByDescending(a => a.Created)
.Take(5)
.ProjectTo<ArticleDto>()
.ToList();

执行查询会产生以下奇怪的异常:

System.ArgumentException: Property 'NS.Models.Semester Semester' is not defined for type 'NS.Models.Semester'

这是一些堆栈跟踪:

System.Linq.Expressions.Expression.Property(Expression expression, PropertyInfo property)
System.Linq.Expressions.Expression.MakeMemberAccess(Expression expression, MemberInfo member)
....
AutoMapper.MappingEngine.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, IDictionary`2 typePairCount)

似乎 AutoMapper 生成了一个表达式,该表达式正在 NS.Models 上寻找 Semester 属性(似乎是对 ArticleDto.Semester 的响应) .Semester 类型当然不存在。如果我执行以下操作,我可以让它工作:

Mapper.CreateMap<Article, ArticleDto>().MaxDepth(1)
.ForMember(a => a.Semester, c => c.MapFrom(a => a.Semester == null ? null : new SemesterDto() {
Key = a.Semester.Key,
Year = a.Semester.Year }));

但这正是我使用 AutoMapper 试图避免编写的东西!

这可能是我这边的问题,但我找不到任何可疑的地方。

编辑:

我在 SemesterDto 上有以下 ctors:

public SemesterDto()
{
}

public SemesterDto(int key, string name)
{
Key = key;
Name = name;
}

当我删除第二个时,一切正常。似乎就是这样,但这确实是一种奇怪的行为。我从没想过 ctor 会出问题,所以为了清楚起见,我没有把它包括在内,一切皆有可能,不是吗。对此感到抱歉。

那么,这是 AutoMapper 的错误还是我误解了什么?

编辑 2:

进一步剥离它,我尝试将 Semester 直接映射到 SemesterDto,结果如下:

context.Semesters.ProjectTo<SemesterDto>().FirstOrDefault();

NotSupportedException:LINQ to Entities 仅支持无参数构造函数和初始值设定项。

这加强了 ctor 导致奇怪行为的想法。

最佳答案

我可以在您的第二次编辑中重现该问题。不知何故(我不太了解 AutoMapper,不知道为什么),参数化构造函数总是优先于 AutoMapper 中的无参数构造函数。并且 EF 在其表达式树中不支持参数化构造函数。

无论如何,您可以使用ConstructProjectionUsing 解决这个问题:

Mapper.CreateMap<Semester, SemesterDto>().MaxDepth(1)
.ConstructProjectionUsing(sem => new SemesterDto());

关于asp.net-mvc - AutoMapper 奇怪的 IQueryable 投影异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32873591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com