Automapper: UseAsDataSource StackOverflow Error

Created on 21 Jun 2016  Â·  21Comments  Â·  Source: AutoMapper/AutoMapper

This is giving me a stackoverflow error, but only when I have a collection navigation property.

return dbSet.UseAsDataSource(mapper).For<TDTO>().AsExpandable().Where(filter).ToList();

The filter is of type Expression<Func<TDTO, bool>>
Possible filter values that this happens with:


filter = {f => (True AndAlso Invoke(f => (True AndAlso Invoke(Param_0 => Convert(Param_0.Cust.CustomerNumber).ToString().Contains("123"), f)), f))} 

filter = {f => (True AndAlso Invoke(f => ((((False OrElse Invoke(Param_0 => Convert(Param_0.Name1).ToString().Contains("som"), f)) OrElse Invoke(Param_0 => Convert(Param_0.Name2).ToString().Contains("som"), f)) OrElse Invoke(Param_0 => Convert(Param_0.PaytoName1).ToString().Contains("som"), f)) OrElse Invoke(Param_0 => Convert(Param_0.PaytoName2).ToString().Contains("som"), f)), f))}

Right now my mappings are just:

cfg.CreateMap<Cust, CustDTO>().ReverseMap();
cfg.CreateMap<Customer, CustomerDTO>().ReverseMap();

Previously I could get away with this because I didn't need the collection.

But now I have added another entity, which requires me to have that collection available in Cust. This Customers property in Cust is just an example of what is causing it.

Here are the relevant properties in the entities:

namespace-Domain:

public class Cust : IEntity   {

       [Key]
       public int CustomerID { get; set; }

       public string CustomerNumber { get; set; }
       public bool Status { get; set; } 
       public virtual ICollection<Customer> Customers { get; set; }
       } 

  public class Customer : IEntity
   {
       [Key]
       public int Id { get; set; }

       [ForeignKey("Cust")]
       public int CustomerId { get; set; }
       public virtual Cust Cust { get; set; }
       public bool Status { get; set; }
       public string Name1 { get; set; }
}

namespace-DTO:

public class CustDTO : IDTO
    {
        public int CustomerID { get; set; }
        public string CustomerNumber { get; set; }
        public bool Status { get; set; }

        public virtual ICollection<CustomerDTO> Customers { get; set; }
    }

public class CustomerDTO : IDTO
    {
        public int Id { get; set; }

        public int CustomerId { get; set; }
        public virtual CustDTO Cust { get; set; }
        public bool Status { get; set; }
        public string Name1 { get; set; }
}

Another note:
I'm not sure if this is relevant, but If I remove .AsExpandable() the error changes to (depending on the filter value stated above):

 'System.ArgumentException'
Property 'namespace-Domain.Cust Cust' is not defined for type 'namespace-DTO.CustomerDTO'

or

 'System.ArgumentException'
Property 'System.String Name1' is not defined for type 'namespace-DTO.CustomerDTO'

I wrote this a while ago, and am a little fuzzy on why I needed AsExpandable(), but it seems it was required to successfully map from Entity -> DTO... as pointed out by the incorrect namespace on the Cust object in the error.

Bug

All 21 comments

So your DTOs have circular references?

I um I uh I uh um um um I uh _uhhhhh......._

Lol well that wasn't necessarily a bad thing, but in LINQ I generally try and avoid it. Otherwise you need to use MaxDepth, but that can be confusing.

When I removed it, everything worked correctly, and realized I didn't need that specific navigation property, but now after my models are getting more complex, I am realizing I do need them.

The only solution I could find and understand was ignoring the CustDTO Cust in my CustomerDTO class, and using AfterMap on CustDTO to foreach through my collection and setting the Cust to each value in that... Then I learned AfterMap does not work with Queryable Extensions.

So I guess this actually is a bug.

Have you tried MaxDepth?

I am still trying to figure out how to use MaxDepth.
The results of my query end up giving me an error:
ArgumentNullException: {"Value cannot be null.\r\nParameter name: body"}

I can't figure out what is going on with the MaxDepth. From what I have read just adding this onto my mappings should prevent the stackoverflow:
cfg.CreateMap<Cust, CustDTO>().MaxDepth(10);

This is the error I get:
ArgumentNullException: {"Value cannot be null.\r\nParameter name: body"}
This error is on the same line as the original...
Here is the stack trace if it helps:

System.Linq.Expressions.Expression.RequiresCanRead(Expression expression, String paramName)
System.Linq.Expressions.Expression.ValidateLambdaArgs(Type delegateType, Expression& body, ReadOnlyCollection`1 parameters)
System.Linq.Expressions.Expression.Lambda(Type delegateType, Expression body, String name, Boolean tailCall, IEnumerable`1 parameters)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.BindEnumerableExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.BindMappedTypeExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.BindEnumerableExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.BindMappedTypeExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.BindEnumerableExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.BindMappedTypeExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.BindEnumerableExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.BindMappedTypeExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.BindEnumerableExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.BindMappedTypeExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.BindEnumerableExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.BindMappedTypeExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.BindEnumerableExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.BindMappedTypeExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.BindEnumerableExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.BindMappedTypeExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.BindEnumerableExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.BindMappedTypeExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.BindEnumerableExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.EnumerableExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.BindMappedTypeExpression(IConfigurationProvider configuration, PropertyMap propertyMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.Impl.MappedTypeExpressionBinder.Build(IConfigurationProvider configuration, PropertyMap propertyMap, TypeMap propertyTypeMap, ExpressionRequest request, ExpressionResolutionResult result, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, ConcurrentDictionary`2 typePairCount)
AutoMapper.QueryableExtensions.ExpressionBuilder.<CreateMapExpression>b__5_0(ExpressionRequest tp)
System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(Type sourceType, Type destinationType, IDictionary`2 parameters, MemberInfo[] membersToExpand)
AutoMapper.QueryableExtensions.ProjectionExpression.To[TResult](IDictionary`2 parameters, IEnumerable`1 memberPathsToExpand)
AutoMapper.QueryableExtensions.ProjectionExpression.To[TResult](IDictionary`2 parameters, String[] membersToExpand)
AutoMapper.QueryableExtensions.ProjectionExpression.To[TResult](Object parameters, String[] membersToExpand)
AutoMapper.QueryableExtensions.ProjectionExpression.To[TResult](Object parameters)
AutoMapper.QueryableExtensions.Impl.SourceInjectedQueryProvider`2.Execute[TResult](Expression expression)
AutoMapper.QueryableExtensions.Impl.SourceInjectedQuery`2.GetEnumerator()
LinqKit.ExpandableQuery`1.GetEnumerator()
System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)

I was able to fix it temporarily by just having child objects that inherit from the other classes, and disabling the navigation property to control the depth... but I feel like this may not be the best way to solve this. MaxDepth would not work no matter what I tried. I ended up getting the "two entities are structurally incompatible" error which I am sure you have seen before.

MaxDepth might not be supported on UseDataSource, @TylerCarlson1 ?

Probably not. To my understanding max depth is only used when actually mapping objects to each other. So it won't work in UseAsDataSource or ProjectTo. I can't confirm in code right now, but I can double check later

Sent from my iPhone

On Jun 28, 2016, at 4:02 PM, Jimmy Bogard <[email protected]notifications@github.com> wrote:

MaxDepth might not be supported on UseDataSource, @TylerCarlson1https://github.com/TylerCarlson1 ?

You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHubhttps://github.com/AutoMapper/AutoMapper/issues/1352#issuecomment-229182481, or mute the threadhttps://github.com/notifications/unsubscribe/AGfIgKnhHEC6Vps8-Yyl-3yS6Kyhyvztks5qQYvygaJpZM4I7EoV.

It is used in ProjectTo, we limit how much we recurse the expressions.

On Tue, Jun 28, 2016 at 5:09 PM, Tyler Carlson [email protected]
wrote:

Probably not. To my understanding max depth is only used when actually
mapping objects to each other. So it won't work in UseAsDataSource or
ProjectTo. I can't confirm in code right now, but I can double check later

Sent from my iPhone

On Jun 28, 2016, at 4:02 PM, Jimmy Bogard <[email protected]
notifications@github.com> wrote:

MaxDepth might not be supported on UseDataSource, @TylerCarlson1<
https://github.com/TylerCarlson1> ?

You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub<
https://github.com/AutoMapper/AutoMapper/issues/1352#issuecomment-229182481>,
or mute the thread<
https://github.com/notifications/unsubscribe/AGfIgKnhHEC6Vps8-Yyl-3yS6Kyhyvztks5qQYvygaJpZM4I7EoV

.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/AutoMapper/AutoMapper/issues/1352#issuecomment-229199561,
or mute the thread
https://github.com/notifications/unsubscribe/AAGYMrTnEWGDZ6EgNmTxbPF9uVym7x-Rks5qQZuAgaJpZM4I7EoV
.

I think it's ProjectTo that has the problem. If the filter never changed and only the entity objects changed to have a circular reference then it's not the filter translation of UseAsDataSource. It only translates what property maps the expression exposes, which haven't changed.

Things to test to prove this point is map the filter expression directly to see if it throws an error. Also try project to instead of UseAsDataSource and see if you get an exception

Sent from my iPhone

On Jun 28, 2016, at 5:44 PM, Jimmy Bogard <[email protected]notifications@github.com> wrote:

It is used in ProjectTo, we limit how much we recurse the expressions.

On Tue, Jun 28, 2016 at 5:09 PM, Tyler Carlson <[email protected]notifications@github.com>
wrote:

Probably not. To my understanding max depth is only used when actually
mapping objects to each other. So it won't work in UseAsDataSource or
ProjectTo. I can't confirm in code right now, but I can double check later

Sent from my iPhone

On Jun 28, 2016, at 4:02 PM, Jimmy Bogard <[email protected]notifications@github.com
mailto:[email protected]> wrote:

MaxDepth might not be supported on UseDataSource, @TylerCarlson1<
https://github.com/TylerCarlson1> ?

You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub<
https://github.com/AutoMapper/AutoMapper/issues/1352#issuecomment-229182481>,
or mute the thread<
https://github.com/notifications/unsubscribe/AGfIgKnhHEC6Vps8-Yyl-3yS6Kyhyvztks5qQYvygaJpZM4I7EoV

.

You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/AutoMapper/AutoMapper/issues/1352#issuecomment-229199561,
or mute the thread
https://github.com/notifications/unsubscribe/AAGYMrTnEWGDZ6EgNmTxbPF9uVym7x-Rks5qQZuAgaJpZM4I7EoV
.

You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHubhttps://github.com/AutoMapper/AutoMapper/issues/1352#issuecomment-229206719, or mute the threadhttps://github.com/notifications/unsubscribe/AGfIgGavqKCK1rD_z8i-kE_SWzjEhMYWks5qQaPSgaJpZM4I7EoV.

Looking at the code and looking at the exception more it says at the very bottom it says AutoMapper.QueryableExtensions.ProjectionExpression.To[TResult](Object parameters)

It looks like MaxDepth is only checked in ExpressionBuilder and not in all its IExpressionBinder's which is where the Circular reference is happening.

@AGnbrown1 If possible can you try and add cfg.AllowNullDestinationValues = false; and see if that fixes the exception with MaxDepth(10)?

with cfg.AllowNullDestinationValues = false; , i get the structurally incompatible error, and if that value is true i get the parameter body cannot be null error

Unless I'm missing something, the only way to break the cycle is to introduce incompatible initializations (for MaxDepth > 1; see the PR for MaxDepth 1). @AGnbrown1 If you disagree, how would the Select look like?

I don't understand what you're saying

To map from model to dto you need to write a select statement. If you think AutoMapper doesn't do it well enough, how would you break the cycle?

Thanks for your help everyone.

What I am getting from this is that if I start using version 5.0.1 will this work for me now?

I am currently using 5.0.2 ... My fix before was to add copies of my classes without the recursion to limit the depth, since MaxDepth wasn't working, but not only does 5.0.2 break that, I now need to do this deeper...so I may need to see 4 or 5 links down the chain instead of just 2.

The way I see it, writing select statements to manually map this would get too messy and is not the way I want to do this.

So right now these are the errors im getting:
When using MaxDepth(5) on Customer and Cust, and MaxDepth(4) on CustomerLink, I get the structurally incompatible error for CustDTO.

When I reverse those numbers, or use 5 on all of the mappings, I get the same error but for CustomerLinkDTO

Adding
cfg.AllowNullDestinationValues = true;
cfg.AllowNullCollections = true;
Gvies me the Argument types do not match error

Using .PreserveReferences() instead of MaxDepth() gives me stackoverflow error.
And if I just remove all this stuff and try to map without any extras, I still get the stackoverflow error.

The errors are still on the UseAsDataSource statement too.

Please help me figure this out if you can, I have been stuck on this for a very long time.
@jbogard

This thread has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.

Was this page helpful?
0 / 5 - 0 ratings