Charleh Charleh - 1 year ago 209
C# Question

Circular reference causing stack overflow with Automapper

I'm using Automapper to map my NHibernate proxy objects (DTO) to my CSLA business objects

I'm using Fluent NHibernate to create the mappings - this is working fine

The problem I have is that the

Order
has a collection of
OrderLines
and each of these has a reference to
Order
.

public class OrderMapping : ClassMap<OrderDTO>
{
public OrderMapping()
{
// Standard properties
Id(x => x.OrderId);
Map(x => x.OrderDate);
Map(x => x.Address);

HasMany<OrderLineDTO>(x => x.OrderLines).KeyColumn("OrderId").Inverse();

Table("`Order`");
}
}

public class OrderDTO
{
// Standard properties
public virtual int OrderId { get; set; }
public virtual DateTime OrderDate { get; set; }
public virtual string Address { get; set; }

// Child collection properties
public virtual IList<OrderLineDTO> OrderLines { get; set; } <-- this refs the lines
}


and:

public class OrderLineMapping : ClassMap<OrderLineDTO>
{
public OrderLineMapping()
{
// Standard properties
Id(x => x.OrderLineId);
References<OrderDTO>(x => x.Order).Column("OrderId");
Map(x => x.Description);
Map(x => x.Amount);

Table("`OrderLine`");
}
}

public class OrderLineDTO
{
// Standard properties
public virtual int OrderLineId { get; set; }
public virtual string Description { get; set; }
public virtual decimal Amount { get; set; }

public virtual OrderDTO Order { get; set; } // <-- this refs the order
}


These DTO objects map to
Order
and
OrderLines
CSLA objects respectively

When auto-mapping to
OrderLines
a list of
OrderLinesDTO
is mapped. Auto mapper is then mapping the
"Order"
property on of the lines, which maps back to
Order
which then circularly maps back to
OrderLine
, then to
Order
and so on

Does anyone know if Automapper can avoid this circular reference?

Answer Source

In your Automapper configuration:

Mapper.Map<OrderLine, OrderLineDTO>()
    .ForMember(m => m.Order, opt => opt.Ignore());

Mapper.Map<Order, OrderDTO>()
    .AfterMap((src, dest) => { 
         foreach(var i in dest.OrderLines) 
             i.Order = dest;
         });
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download