使用Automapper导致堆栈溢出的循环引用

Cha*_*leh 14 c# csla circular-reference automapper-2

我正在使用Automapper将我的NHibernate代理对象(DTO)映射到我的CSLA业务对象

我正在使用Fluent NHibernate来创建映射 - 这很好用

Order遇到的问题是它有一个集合,OrderLines每个都有一个参考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
}
Run Code Online (Sandbox Code Playgroud)

和:

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
}
Run Code Online (Sandbox Code Playgroud)

这些DTO 对象分别映射到CSLA对象OrderOrderLinesCSLA对象

自动映射到映射OrderLines列表时OrderLinesDTO.然后,自动映射器映射行的"Order"属性Order,然后映射回到然后循环映射回到OrderLine,然后到Order等等.

有谁知道Automapper是否可以避免此循环引用?

Ste*_*tty 23

在您的Automapper配置中:

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;
         });
Run Code Online (Sandbox Code Playgroud)

  • 感谢史蒂夫·史蒂夫(Steve),但我希望避免针对特定类型,因为我试图通过约定通过通用类型进行映射,并将映射代码的数量几乎保持为零。我的泛型不会知道派生类型上的任何属性名称,因此可能必须为派生类型创建虚拟方法来维持这种关联。 (2认同)

kur*_*l94 8

我在使用 EF 6 和 AutoMapper 6 时遇到了同样的问题。显然 Kenny Lucero 发布的内容让我找到了解决方案。以下是 AM 网站的摘录:

// Circular references between users and groups
cfg.CreateMap<User, UserDto>().PreserveReferences();
Run Code Online (Sandbox Code Playgroud)

将 PreserveReferences() 添加到两个模型使其工作。