17

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
}

と:

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
}

これらの DTO オブジェクトは、それぞれOrderおよびOrderLinesCSLA オブジェクトにマップされます。

OrderLinesのリストへの自動マッピングOrderLinesDTOがマッピングされている場合。次に、自動マッパーは"Order"行のプロパティをマッピングします。これは にマップされ、Order次に に循環的にマップされOrderLine、次に にマップOrderされます。

Automapper がこの循環参照を回避できるかどうかは誰にもわかりませんか?

4

6 に答える 6

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;
         });
于 2012-07-16T13:48:51.843 に答える