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

标签 c# circular-reference csla 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
}

和:

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 对象分别映射到 OrderOrderLines CSLA 对象

当自动映射到 OrderLines 时,会映射一个 OrderLinesDTO 列表。自动映射器然后将 "Order" 属性映射到行上,该属性映射回 Order,然后循环映射回 OrderLine,然后Order 等等

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

最佳答案

在您的 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;
         });

关于c# - 使用 Automapper 导致堆栈溢出的循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11505128/

相关文章:

winforms - 如何配置适用于 Azure 的 CSLA WCF 数据门户?

c# - 将复杂文本作为字符串获取

c# - @using(Html.BeginForm) 返回空值

c# - 为什么 Visual Studio 不警告静态字符串的循环初始化?

python - Python的垃圾回收能保证在任何情况下都回收循环引用对象吗?

c++ - C++/类中相互依赖的循环依赖

c# - csla 验证错误 : Insert is an Invalid Operation

c# - 要使 XML 可序列化,从 ICollection 继承的类型必须具有 Add 的实现

c# - XNA Windows 安装项目不包括我的内容项目

c# - 使用 ValueInjecter 从 ExpandoObject 注入(inject)